2010-08-06 59 views
1

我正在嘗試使用NHibenate,Burrow和Ninject。使用Ninject綁定Nhibernate.Burrow的ISession

我似乎無法使用ninject綁定Burrow ISession。

我現在有

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提供商任務,它可以徹底管理更復雜的工廠(而不是這些東西幾乎像上面的內聯工廠方法一樣工作)。

編輯:我將你的評論解釋爲暗示你嘗試了它,但發現我會搞砸了,假設有一個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,我們可以如下創建lambda表達式:

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分別爲

它們都是等效的 - 編譯器爲每個輸出生成相同的輸出。

區別在於在lambda語法中沒有等效的語法0。

強烈推薦喬恩斯基特的C#的深度爲使所有這些東西明確(但等到第二版這是幾個月的短號碼外)

(如果有時間做更深入的答案會看在Ninject源/ API,並看看他們是否在始終或從未通過上下文一致)

0

感謝魯本

你會澄清我 東西是什麼

之間的區別

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的問題 - 應該首先做到這一點),但我離題了......)。 (通過編輯回答....) – 2010-08-09 14:55:31

+0

因此,根據我的編輯進行總結:第一段代碼匹配0或n個參數,第二個匹配恰好爲1,第三個與第二個匹配。第四,'(IContext arg)'可以省略,因爲使用委託語法而不是lambda。第五,lambda具有零參數,但沒有ToMethod的重載匹配。希望這是明確的。我知道我已經回答了另一個關於SO的問題,它有更好的討論和lambda和委託語法之間的區別的例子(我的答案指出,主張lambda語法的地方是你想匹配0或n代表的地方params並忽略他們) – 2010-08-09 15:12:57

+0

謝謝魯本 我曾嘗試編輯我的問題/添加評論,但由於某種原因沒有辦法。 感謝您的澄清,我一定會檢查Jon Skeet的書。開始讓我的手進入C#。 我很感激你的幫助。 – Jokiliku 2010-08-09 17:17:15