C# 如何让Ninject 2为LINQ to SQL DataContext使用无参数构造函数?
我已经开始在基于以下技术的项目中使用Ninject 2(昨天从Github下载,包括MVC扩展项目):C# 如何让Ninject 2为LINQ to SQL DataContext使用无参数构造函数?,c#,asp.net-mvc,linq-to-sql,ninject,C#,Asp.net Mvc,Linq To Sql,Ninject,我已经开始在基于以下技术的项目中使用Ninject 2(昨天从Github下载,包括MVC扩展项目): .NET3.5SP1 ASP.NET MVC 1.0 LINQ到SQL 这里没有什么神奇之处——我有几个存储库接口(命名为IEntityRepository),它们在运行时代码中使用LINQ to SQL实现(在单元测试代码中使用哈希表)。这些存储库中的每一个都需要一个从LINQ到SQL的DataContext实例,以便与数据库通信,因此这是具体存储库类上的构造函数参数。绑定设置如下: K
- .NET3.5SP1
- ASP.NET MVC 1.0
- LINQ到SQL
Kernel.Bind<MyDataContext>().ToSelf().InRequestScope();
Kernel.Bind().ToSelf().InRequestScope();
这样做的原因是,如果我碰巧需要更多的存储库,我希望能够在不同的存储库之间共享实体,并且有了LINQ到SQL datacontext的工作原理,对我来说,每个HttpRequest创建一个实体似乎是有意义的
我通常使用MyDataContext的无参数构造函数-我不认为这是一种风险,因为这用于测试系统上的内部项目,所以datacontext中的“内置”连接字符串是无害的。然而,由于Ninject 2是“贪婪”的,并且需要具有最多参数的构造函数,而且我不能以任何有意义的方式将[Inject]
参数粘贴到生成的代码中,因此每当Ninject尝试创建我的一个控制器(需要存储库,需要datacontext)时,我都会收到一个错误
我已经看到了IConstructorScorer
的提及,以及创建一个“反向”构造函数的能力,该构造函数总是使用参数最少的构造函数,但是,这将改变注入对其他所有内容的工作方式-除了datacontext之外,其他所有内容可能都需要默认行为
那么-有没有一个好的、干净的方法来指定这个绑定(并且只有这个绑定)应该使用一个特定的构造函数?我们能否像在Ninject 1中那样对供应商做同样的事情,并提供我们自己的“工厂”?或者我应该放弃并尝试将参数输入到有意义的datacontext中吗?找到了答案-通过绑定到提供者,这是非常容易的
Kernel.Bind<MyDataContext>().ToProvider<ContextProvider>().InRequestScope();
似乎我侥幸逃脱了惩罚——效果很好。:) 我想您也可以使用“ToMethod”绑定来避免实现自定义提供程序,我就是这样使用的:
Kernel.Bind<MyDataConext>().ToMethod(c => new MyDataContext())
Kernel.Bind().ToMethod(c=>newmydatacontext())
完整地说,我将添加InRequestScope()
以确保DataContext的生存期范围正确。
Kernel.Bind<MyDataConext>().ToMethod(c => new MyDataContext())