我一直在使用Ninject很短的时间,我正试图弄清楚如何使用app.config/web.config条目做一些我在Unity中完成的事情.
我很确定这很简单,只是没有找到实现它的最佳方法,当然Ninject没有最好的文档.
我希望为接口提供不同的实现,而不需要更改代码 - 特定的应用程序知道要使用哪个实现.
例如,当我使用Unity时,我会有一个实时应用程序和一个单元测试库,使用不同的数据库.所以:
var repo = IoC.Get<IRepository>();
Run Code Online (Sandbox Code Playgroud)
会RealRepository在我的实时应用程序中返回一个,并FakeRepository在我的单元测试中返回.我只是在app.config或web.config中映射类.
在Ninject中,既然您在代码中定义了映射,那么似乎没有办法决定您使用哪些实现(或哪个模块),除了代码 - 但当然整个目的是我不想要的必须具体说明我想使用哪种实现.
有没有办法做到这一点?我能想到的唯一方法是从配置文件中动态选择NinjectModule实现,但这感觉不对.
听起来像是你错过了一个IoC容器作为服务定位器.这给你带来很多问题.其中之一是测试要困难得多.我建议改为做正确的做构造函数注意而不是服务位置.
这意味着代替
public class MyClass
{
public void Do()
{
var repo = IoC.Get<IRepository>();
....
}
}
Run Code Online (Sandbox Code Playgroud)
你做
public class MyClass
{
private IRepository repo;
public MyClass(IRepository repo)
{
this.repo = repo;
}
public void Do()
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
只有一个获取应用程序的根目录.其他一切都通过构造函数传递.
它使测试非常简单:
var testee = new MyClass(new Mock<IRepository>());
Run Code Online (Sandbox Code Playgroud)