Asp.net mvc 3 建议使用这种构造函数注入吗?

Asp.net mvc 3 建议使用这种构造函数注入吗?,asp.net-mvc-3,dependency-injection,Asp.net Mvc 3,Dependency Injection,假设您有一个名为ServicesProvider的对象,他的角色是提供服务。它将提供诸如Mailer、Logger和CacheService等服务对象 对于那些倾向于说它违反了单一责任原则的人来说,它是如何打破的?它的角色只是提供服务,它只做一件事,因为他的职责是提供服务对象 代码如下: public class ServicesProvider : IServicesProvider { // Properties... public ServicesProvider(

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

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

代码如下:

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

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

将所有可能的依赖项聚合到一个对象中,然后每个类都需要一个知道如何获取所有依赖项的对象,而不是只需要所需的依赖项。如果您使用这个根目录,那么您最好放弃依赖项注入部分,直接使用服务定位器模式

这样一来,您就隐藏了类的真正需求,例如,您无法通过查看类的构造函数来知道类是否只需要
ICacheService
,因为它接收到一个
IServiceProvider
,允许它在其生命周期的任何时间点请求任何服务


正如我所说的,您试图做的与使用服务定位器模式非常相似,因此您可以研究使用依赖注入与服务定位器来满足控制反转需求的优缺点。

IServiceProvider
注入到其他类中,(仍然)称为服务定位器模式,这被认为是不好的。请在此阅读更多相关内容:。@Rushino:我注意到您最近问了很多关于DI的问题。那很好,欢迎你继续这样做。然而,如果你想连贯地处理这个话题,你可以读我的书;)@马克西曼哈哈。是的,我当然可以,别担心,我可能是那种会读大部分书的人。。但不幸的是,时间并不在我这边:(如果从该基类继承的每个类都需要所有服务,那么在基类级别需要这些服务是有意义的。使用基类将需要将所有依赖项以及派生类可能需要的任何依赖项传递给基类。这可能会导致一些非常丑陋的构造函数。支持compos继承之上的缺陷。@Steven不!不要用技术技巧将构造函数扫过注入气味-此评论的扩展版本@Ruben:With great power…我们应该时刻警惕违反SRP的行为,而ctor过度注入通常就是一种迹象。我并不是说基本属性注入总是被忽略的方法是这样的。但是你是对的,我的建议可能有点棘手,因为很容易滥用和过度使用这种技术。我只会在少数情况下建议这种技术,就像我上面描述的那样。另一种选择是使用聚合服务。然而,这种方法的缺点是,它使代码不那么干净,因为我们必须编写
this.aggregate.Db
而不是
this.Db
。有关的详细信息。