I am trying use NHibenate, Burrow and Ninject.
I cannot seem to be able to bind the Burrow ISession using ninject.
I currently have
Bind<ISession>().ToProvider( new BurrowFramework().GetSession()).InRequestScope();
I get the errors
cannot convert from 'NHibernate.ISession' to 'System.Type'
The best overloaded method match for 'Ninject.Syntax.IBindingToSyntax<NHibernate.ISession>.ToProvider(System.Type)' has some invalid arguments
Where Am I going Wrong?
Вы, вероятно, захотите:
Bind<ISession>().ToMethod( () => new BurrowFramework().GetSession()).InRequestScope();
Взгляните на документацию Ninject - ToProvider относится к определенному интерфейсу, который требует поставщик Ninject, который позволяет вам аккуратно управлять более сложными фабриками (в отличие от вещей, которые работают почти так же встроенный фабричный метод, как указано выше).
РЕДАКТИРОВАТЬ: Я интерпретирую ваш комментарий как подразумевающий, что вы пробовали его, но обнаружили, что я ошибся, предполагая, что произошла перегрузка ToMethod, когда делегат не имеет параметров, и эти тонкие различия в синтаксисе делегата сбивают вас с толку. Если это не так, я должен был написать:
Bind<ISession>().ToMethod( ctx => new BurrowFramework().GetSession()).InRequestScope();
Теперь краткое описание синтаксиса C #:
В C # 2 у нас были анонимные делегаты, как показано ниже:
0) ToMethod( delegate {})...
1) ToMethod( delegate() {})...
2) ToMethod( delegate(x) {})...
3) ToMethod( delegate(X x) {})...
4) ToMethod( delegate(x, y) {})...
5) ToMethod( delegate(X x, Y y) {})...
В C # 3 мы можем создавать лямбда-выражения следующим образом:
1) ToMethod( () => {})...
2) Method( name => {})...
3) ToMethod( (X x) => {})...
4) ToMethod( (x, y) => {})...
5) ToMethod( (X x, Y y) => {})...
Которые соответствуют нулю, 1 любого типа, 1 типа X, 2 любого типа, X, за которым следует Y соответственно
Все они эквивалентны - компилятор генерирует одинаковые выходные данные для каждого.
Разница в том, что в лямбда-синтаксисе нет эквивалента синтаксиса 0.
Настоятельно рекомендую C # in Depth Джона Скита, чтобы прояснить все это (но дождитесь второго издания, которое появится через несколько месяцев)
(Если бы у вас было время дать более подробный ответ, взгляните на Ninject источники / API и посмотрите, согласованы ли они всегда или никогда не передают контекст)
Спасибо Ruben
Не могли бы вы что-то прояснить для меня В чем разница между
Bind<ISession>().ToMethod(delegate { return new BurrowFramework().GetSession(); }).InRequestScope();
и
Bind<ISession>().ToMethod(arg => new BurrowFramework().GetSession()).InRequestScope();
или
Bind<ISession>().ToMethod((IContext arg) => new BurrowFramework().GetSession()).InRequestScope();
Я бы ожидал, что первый будет выглядеть как
(delegate(IContext arg){ return new BurrowFramework().GetSession();}
, но, похоже, он работает, пока это не работает
Bind<ISession>().ToMethod( () => new BurrowFramework().GetSession()).InRequestScope();