我正在尝试使用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
我哪里错了?
答案 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();