[英]Constructors + Dependency Injection
如果我要编写一个包含多个构造函数参数的类,例如:
class A{
public A(Dependency1 d1, Dependency2 d2, ...){}
}
我通常会创建一个“参数持有人”类型的类,例如:
class AArgs{
public Dependency1 d1 { get; private set; }
public Dependency2 d2 { get; private set; }
...
}
接着:
class A{
public A(AArgs args){}
}
通常,使用DI容器,我可以为依赖项配置构造函数并解决它们,因此在需要更改构造函数时,影响最小。
这是否被视为反模式和/或反对这样做的任何论点?
这确实为您的依赖项是可选的打开了大门。 通过为AArgs类的每个依赖项都具有属性,某人可以认为他们只需要填写Dependency1,一切都会按预期进行。
通过显式地单独列出所有依赖项,可以明确约定类正常运行所需的条件。 如果您有太多的依赖关系,以至于构造函数很繁琐,则应将其视为一种气味,因为您的类可能做得太多。
Mark Seemann对此发表了博客 。
您正在传递的是依赖关系的集合,而不是每个依赖关系本身,基本上是重构。 马克(Mark)辩称,通过这样做,您可以使域中的事物变得显式,而以前是隐式的。
我唯一关心的是,依赖项持有AArgs
可能掩盖了您拥有大量依赖项这一事实,因此您正在构造的类可能承担了太多责任。
如果您的依赖关系持有AArgs
通常只有很少的成员(例如3个或更少),那么这不是问题。
好吧,我不会称其为反模式,但是如果开发人员需要对您的代码库进行更改,则会弄清楚构造函数的需求,因此“为了安全”只需将所有依赖项对象传递给构造函数即可。 kes! 它是那些可能被滥用的抽象之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.