我正在尝试使用NHibenate,Burrow和Ninject。
我似乎不能使用一个对象来绑定洞穴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我哪里错了?
发布于 2010-08-09 19:45:26
您可能想要执行以下操作:
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中,我们可以创建lambdas,如下所示:
1) ToMethod( () => {})...
2) Method( name => {})...
3) ToMethod( (X x) => {})...
4) ToMethod( (x, y) => {})...
5) ToMethod( (X x, Y y) => {})...它们分别匹配零、任意类型的1、任意类型的1、任意类型的2、X后跟Y
它们都是等价的-编译器为它们生成相同的输出。
不同之处在于lambda语法中没有语法0的等价物。
我强烈推荐Jon Skeet的C#,它能让所有这些东西变得清晰(但等着看第二版吧,离第二版还有几个月的时间)
(如果有时间给出更深入的答案,可以查看一下Ninject源代码/API,看看它们是否总是一致,或者永远不会传递上下文)
发布于 2010-08-09 21:57:47
谢谢鲁本
你能给我澄清一下吗?
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();https://stackoverflow.com/questions/3426758
复制相似问题