我们正在将Ninject用于IOC。
我们所有的Repository对象都可以(并且应该)被模拟用于单元测试。我想强制所有开发人员在与存储库交互时仅对接口进行编码。为此,我想将构造函数设为私有,并为构造创建静态访问器工厂方法:
public class SomeRepository : ISomeRepository
{
private SomeRepository()
{
}
public static ISomeRepository Create()
{
return StandardKernel.Get<ISomeRepository>();
}
}
问题在于:我如何让Ninject创建实际对象?我在同一个项目中有了存储库接口和类
答案 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即可在没有私有构造函数的情况下创建应用程序的单个实例。