使用Ninject绑定Nhibernate.Burrow的ISession

时间:2010-08-06 18:44:33

标签: c# nhibernate inversion-of-control ninject

我正在尝试使用NHibenate,Burrow和Ninject。

我似乎无法使用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 个答案:

答案 0 :(得分:2)

您可能想要这样做:

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

查看Ninject文档 - ToProvider引用Ninject提供程序所要求的特定接口,它允许您干净地管理更复杂的工厂(而不是像上面的内联工厂方法那样工作的东西)。 / p> 编辑:我将你的评论解释为暗示你试过但发现我已经搞砸了假设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个,类型X中的1个,任何类型中的2个,分别是X后跟一个Y

它们都是等价的 - 编译器为每个产生相同的输出。

区别在于lambda语法中没有等效的语法0。

强烈推荐Jon Skeet的深度C#让所有这些东西变得清晰(但等待第二版,这是短短几个月之后)

(如果有时间给出更深入的答案,请查看Ninject源/ API,看看它们是否始终一致或从不传递上下文)

答案 1 :(得分:0)

谢谢鲁本

你能为我澄清一些事吗? 有什么区别

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();