【发布时间】:2011-09-27 03:35:29
【问题描述】:
我们将 Ninject 用于 IOC。
我们所有的 Repository 对象都可以(并且应该)被模拟用于单元测试。我想强制所有开发人员在与存储库交互时仅对接口进行编码。为此,我想将构造函数设为私有并为构造创建静态访问器工厂方法:
public class SomeRepository : ISomeRepository
{
private SomeRepository()
{
}
public static ISomeRepository Create()
{
return StandardKernel.Get<ISomeRepository>();
}
}
问题在于:我如何让 Ninject 创建实际的对象?我在同一个项目中有存储库接口和类
【问题讨论】:
-
Obligatory Service Locator link. 在继续你的设计之前,我会读两遍——
StandardKernel.Get看起来像这里的服务定位器。我不会说“这里的服务定位器肯定是错误的”,但 Mark Seemann 会说,如果我是你,我会相信他。 -
为什么要强制执行私有构造函数?无意冒犯,但我认为您应该信任您的开发人员,并简单地定义某些书面或口头约定,而不是用笨拙的设计使事情过于复杂......
-
@default.kramer:完全同意这篇文章,这就是为什么我不想落入同样的陷阱。由于没有其他方法来创建对象,我打算强制维护开发人员使用 IOC 而不是方向实例化
-
@DanielMarbach:我们有很多维护开发人员,甚至一些功能开发人员,他们只会走最短路线来解决问题,而“new someobject()”是最短路线,而不是设置建立接口和对象之间的映射,然后使用一些奇怪的语法来实例化。这就是现实:(
-
我再次删除了我的答案,因为我对它不满意。我浏览了一些关于 IoC、DI 和 Ninject 的文档,并得出结论同意 Daniel Marbach 关于代码审查的观点。 Ninject StandardKernel 使用构造期间提供的规则来确定具体实例并将完成的对象返回给调用方法。为什么让
SomeRepository使用内核?SomeRepository的 IoC 的想法不是不必构造或加载它自己的依赖项吗?我同意代码审查是确保所有开发人员按要求使用内核的方法。
标签: .net constructor inversion-of-control ninject