依赖注入:将构造函数注入优势与Setter Injection优势相结合?

时间:2011-04-18 09:37:02

标签: .net dependency-injection inversion-of-control

我很恼火必须通过Constructor传递管道对象,因为我想保留业务实体或值传递的构造函数参数。

所以我想通过Setters传递,但是只要这些setter没有被填满,我的对象就不应该被实例化。

如果没有一堆if1如果不为空而且dependency02不为空,知道BOTH不能为空,怎么做呢?

3 个答案:

答案 0 :(得分:1)

您正试图绕过构造函数。如果对象确实需要使对象处于一致状态,我建议重新考虑使用构造函数来实现此目的。

编辑:从我的观点来看,最好的是构建模式,它结合了两者的优点:

  • 允许创建不可变对象(!) - 设置者违反此
  • 允许按名称设置依赖关系而不必使用索引 - 设置者的最大优势(如果不仅仅是)

答案 1 :(得分:1)

您无法在对象上设置任何内容,直到被实例化,因此您的要求(如上所述)是不可能的。

如果你使用静态工厂方法,你可以使用setter - 但这需要你的构造函数是私有的,所以除了构造函数之外真的不会改变任何东西。

您可以使用依赖于某些属性设置的Initialize方法,但您必须依赖于被调用的方法。这意味着需要大量的管道才能确保调用该方法(例如,每个类方法都必须调用if (!IsInitialized) throw ...),或者只是将脆弱性引入代码中。

任何替代解决方案都不如在构造函数中放置绝对必需的数据那么健壮或更多工作 - 这是构造函数参数的用途。我的建议是你需要重新审视构造函数参数被“保留”的任意要求,以支持更具技术意义的东西。

答案 2 :(得分:1)

您可以创建一个接受依赖项的工厂类。

factory = new Factory(dep01, dep02);

使用create方法传入您的业务实体。

factory.Create(someBusinessObject);

我并不完全喜欢这种(错误)使用工厂的构造函数,但它确实解决了你的问题。