Ninject和私人建设者

时间:2011-09-27 03:35:30

标签: .net constructor inversion-of-control ninject

我们正在将Ninject用于IOC。

我们所有的Repository对象都可以(并且应该)被模拟用于单元测试。我想强制所有开发人员在与存储库交互时仅对接口进行编码。为此,我想将构造函数设为私有,并为构造创建静态访问器工厂方法:

public class SomeRepository : ISomeRepository
{
 private SomeRepository()
 {
 }
 public static ISomeRepository Create()
 {
   return StandardKernel.Get<ISomeRepository>();
 }
}

问题在于:我如何让Ninject创建实际对象?我在同一个项目中有了存储库接口和类

3 个答案:

答案 0 :(得分:3)

我们最终会采取以下措施:

public class SomeRepository : ISomeRepository
{
 private SomeRepository()
 {
 }
 public static ISomeRepository CreateForIOC()
 {
   return new SomeRepository();
 }
}

在模块加载期间,我们将StandardKernel的ISomeRepository接口映射到CreateForIOC()方法。

这不会阻止开发人员直接调用CreateForIOC,但至少强制他们a)接口的代码,b)意识到CreateForIOC()可能不是在实例化对象时调用的正确方法,并且至少要求来自首席开发人员的问题

答案 1 :(得分:1)

为什么不让Ninject为需要它的任何对象提供具体的存储库,而不是私有构造函数或工厂方法?

答案 2 :(得分:0)

看起来你正在尝试使用单例模式。通常,单例模式被认为是反模式,主要是因为它阻碍了单元测试。依赖注入允许您通过配置创建单例,而无需使用单例模式。

我建议您只需配置Ninject即可在没有私有构造函数的情况下创建应用程序的单个实例。