我刚刚开始使用IoC容器,并且已经开始使用Ninject。我理解您可以合并到内核中的单独模块的原理。但是我很好奇我是否应该在我的代码中到处都是第一行,我将要求从我的服务层中具体实现某些内容。
IKernel kernel = new StandardKernel(new SimpleModule());
// example: getting my ContentService
IContentService contentService = kernel.Get<IContentService>();
如果我有一个包含10个使用ContentService的方法的类,我应该在每个方法中新建一个Module和一个内核吗?好像是代码味道。大多数开发人员如何使用Ninject处理这个问题?是否有任何在线文章显示了与消费者类一起做这件事的正确方法?
答案 0 :(得分:3)
如果我有一个包含10个方法的类,我应该使用ContentService 在每种方法中真正新建一个模块和一个内核?
不,你应该让这个类把IContentService
作为构造函数参数(因为它在它的方法中取决于它),然后让内核为你提供这个类的实例。你的课程对DI容器一无所知(在你的情况下是Ninject)。他们永远不应该参考它。
答案 1 :(得分:1)
基本上有两种使用IoC的方法:依赖注入(DI)和服务位置(SL)。 处理依赖注入时,您可以从类外部提供依赖关系。通常,您可以通过将依赖项注入(传递)到类构造函数中或使用setter来完成此操作。例如:
public class SomeClass {
public ISomeDependency SomeDependency {get;set;}
public SomeClass(ISomeOtherDependecy someOtherDependency) {
//...
}
}
在这种情况下,您可以通过属性提供ISomeDependency实现,您应该通过构造函数提供ISomeOtherDependecy实现。 Ninject支持两种方式。
另一种做法(SL)允许您在需要时请求您的依赖项,例如:
public void DoSomeAction() {
ISomeDependency someDependency = MyServiceLocatorImpl.GetInstance<ISomeDependence>()
}
如果您打算使用SL方法(或混合方法),可以使用Common Service Locator(Ninject has support)。以后可以轻松切换IoC引擎。