我们正在为 IOC 使用 Ninject。

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

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

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

最佳答案

我们最终将采用以下方法:

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

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

这并不会阻止开发人员直接调用 CreateForIOC,但至少会迫使他们 a) 向接口(interface)编写代码,b) 意识到 CreateForIOC() 可能不是实例化对象时调用的正确方法,并且至少提出一个问题来自主要开发人员

关于.net - Ninject 和私有(private)构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7563937/

10-09 06:15