2010-08-06 6 views
1

Я использую NHibenate, Burrow и Ninject.Связывание Nhibernate.Burrow's ISession с использованием Ninject

Я, похоже, не могу связать ISR с помощью ninject.

настоящее время у меня

Bind<ISession>().ToProvider(new BurrowFramework().GetSession()).InRequestScope(); 

Я получаю ошибки

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 

Где я буду неправильно?

ответ

2

Вы, вероятно, хотите сделать:

Bind<ISession>().ToMethod(() => new BurrowFramework().GetSession()).InRequestScope(); 

Посмотрите в документации Ninject - ToProvider относится к конкретному интерфейсу, а мандаты провайдера Ninject, который позволяет управлять более сложными заводами чисто (в отличие от материал, который работает почти как встроенный заводский метод, как указано выше).

EDIT: Я интерпретирую ваш комментарий как подразумевающий, что вы его попробовали, но обнаружили, что я перепутал в предположении, что произошла перегрузка 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 любого типа, Х за которыми следует Y соответственно

Все они эквивалентны - компилятор генерирует одинаковый выход для каждого.

Разница в том, что в синтаксисе лямбда нет эквивалента синтаксиса 0.

Очень рекомендую Джона Скита C# Глубины для изготовления все эти вещи ясно (но ждать второго издания, который является короткий номер месяца езды)

(Если было время, чтобы дать более глубокий ответ будет выглядеть на в Ninject источники/API, и посмотреть, если они последовательны в всегда или никогда не передавая контекст)

0

Благодаря 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

(В случае, если это не очевидно, редактирование вашего вопроса - лучший способ сделать это взад и вперед или комментарии, но у вас еще нет ответа (+ 1 вопрос) - должно было это сделать в первую очередь), но я отвлекаюсь ...). (Ответ через edit ....) –

+0

Итак, подведение итогов на основе моего редактирования: первый фрагмент соответствует 0 или n параметрам, второй соответствует точно 1, третий - тот же, что и второй. На четвертом, '(IContext arg)' можно опустить как использование синтаксиса делегата, а не лямбда. На пятом, лямбда имеет нулевые параметры, но перегрузки ToMethod не совпадают. Надеюсь, это понятно. Я знаю, что я ответил на другой вопрос о SO, который имеет гораздо лучшее обсуждение и примеры различий между синтаксисом лямбда и делегата (в моем ответе указывалось, что основной случай, когда кто-то предпочитает синтаксис лямбда, - это то, где вы хотите сопоставить 0 или n делегировать params и игнорировать их) –

+0

Спасибо Ruben Я попытался изменить свой вопрос/добавить комментарий, но по какой-то причине не было никакого способа. Спасибо за разъяснение. Я обязательно закажу книгу Джона Скита. Начинаем получать руки на C#. Я ценю вашу помощь. – Jokiliku

Смежные вопросы