【发布时间】:2019-07-02 13:32:44
【问题描述】:
我尝试使用尽可能多的接口来进行良好的单元测试并更好地理解程序架构。
尽管我尝试遵循 SOLID 规则 - 我的类需要在构造函数中传递大量依赖项,这变成了地狱。
搜索使我找到了 IoC 容器,但实际上我不太了解何时使用它们。在构造函数中传递一个 NInject 内核看起来是一个愚蠢的想法,并且只使用 NInject 创建主类并不能消除构造函数中一堆参数的问题。
我无法减少构造函数中的依赖数量。我不明白如何正确使用 NInject 来减少构造函数参数。我该如何解决这个问题?
(不是最坏的例子)
public SomeConstructor(ISettings settings, INotification notification, IServer server, IPriceCache priceCache)
{
Settings = settings;
Notification = notificartion;
Server = server;
PriceCache = priceCache;
}
(这个解决方案看起来很糟糕)
public SomeConstructor(IKernel ninjectKernel)
{
Settings = ninjectKernel.Get<ISettings>();
Notification = ninjectKernel.Get<INotification>();
Server = ninjectKernel.Get<IServer>();
PriceCache = ninjectKernel.Get<IPriceCache>();
}
【问题讨论】:
-
我不确定我是否理解,您的构造函数只有一个参数,即容器。如果您指的是您在类本身中拥有的依赖项的数量,那么这是另一个与代码耦合有关的问题,而不是这里提出的问题
-
@DavidPilkington 创建一个存储所有接口并将其传递给构造函数的中心类是个好主意吗?
-
四个构造函数参数几乎不是地狱。甚至十个。不仅如此,我开始有点担心——不是关于 DI 方法,而是关于我的对象模型,因为它可能表明该类正在做太多事情(参见Single Responsibility Principle)。要回答您的问题,不,这不是一个好主意; creating a central class is actually an anti-pattern.
标签: c# constructor dependencies