建议使用这种构造注射吗?

时间:2011-12-09 14:58:47

标签: asp.net-mvc-3 dependency-injection

假设您有一个名为ServicesProvider的对象,他的角色是提供服务。它将提供服务对象,如Mailer,Logger和CacheService。

对于那些倾向于说它违反单一责任原则的人来说,它是如何打破它的呢?它的作用只是提供服务,它不是一件事,因为他的职责是提供服务对象。

以下是代码:

public class ServicesProvider : IServicesProvider {
   // Properties...
   public ServicesProvider(
       ICacheService cacheService, 
       ILoggerService loggerService, 
       IMailerService mailerService) { ... }
}

是否建议将此对象注入需要服务的任何业务类?如果没有,为什么?有什么建议的方法来解决这个问题,请提供一个完整的例子?

1 个答案:

答案 0 :(得分:3)

您正在聚合单个对象中的所有可能的依赖项,然后每个类而不是仅需要所需的依赖项,需要一个知道如何获取所有依赖项的对象。如果你要使用这个根,你可以放弃依赖注入部分,直接使用服务定位器模式。

这样,您可以隐藏类的实际需求,例如,只是通过查看其构造函数,您无法知道某个类是否只需要ICacheService,因为它接收到IServiceProvider允许她要求在其生命周期的任何阶段提供任何服务。

正如我所说,你要做的就是使用服务定位器模式非常相似,这样你就可以研究使用依赖注入与服务定位器的优缺点来满足控制需求的反转。