C# 如何让Ninject 2为LINQ to SQL DataContext使用无参数构造函数?

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

我已经开始在基于以下技术的项目中使用Ninject 2(昨天从Github下载,包括MVC扩展项目):

  • .NET3.5SP1
  • ASP.NET MVC 1.0
  • LINQ到SQL
这里没有什么神奇之处——我有几个存储库接口(命名为IEntityRepository),它们在运行时代码中使用LINQ to SQL实现(在单元测试代码中使用哈希表)。这些存储库中的每一个都需要一个从LINQ到SQL的DataContext实例,以便与数据库通信,因此这是具体存储库类上的构造函数参数。绑定设置如下:

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