Binding Nhibernate.Burrow's ISession using Ninject

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?

1
задан CraigTeegarden 6 April 2013 в 20:19
поделиться

2 ответа

Вы, вероятно, захотите:

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 и посмотрите, согласованы ли они всегда или никогда не передают контекст)

2
ответ дан 2 September 2019 в 22:22
поделиться

Спасибо 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();
0
ответ дан 2 September 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: