2011-04-18 41 views
2

我很烦恼不得不通过构造函数传递管道对象,因为我想为业务实体或值保留构造函数参数。依赖注入:将构造函数注入优点与Setter注入优点结合起来?

所以我想通过Setters传递,但是只要这些setters没有被fullfilled,我的包含依赖的对象就不应该被实例化。

如何做到这一点没有一堆如果dependency01不为空,并且dependency02不为空知道BOTH不能为空?

回答

1

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

编辑:从我的角度最好的一点是它结合了两者的建造者模式:

  • 允许不变对象的创建 - 的制定者违反本
  • 允许(!)设置按名称依赖,而不必使用指标 - 制定者的最大的(如果不是唯一的)优势
+0

我不想绕过构造函数,我想为业务依赖项使用业务对象的构造函数,而不是将基础结构对象与业务项目混合使用。 – user310291 2011-04-18 10:10:53

+0

没关系。我只是不明白为什么人们不喜欢使用构造函数。如果您认真对此主题感兴趣,请参阅关于此主题的精彩文章:http://googletesting.blogspot.com/2009/02/constructor-injection-vs-setter.html – 2011-04-18 10:53:30

+0

我在这个主题上花了几个晚上和结论我是使用建造者模式。结合(从我的角度来看)两种方法中最好的:允许构建不可变对象+允许通过名称设置依赖关系。 – 2011-04-18 10:57:35

1

你不能一个对象上设置任何东西,直到它已经被实例化,所以你的要求(如上所述)是不可能的。

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

您可以使用Initialize方法,该方法依赖于设置的某些属性,但必须依赖被调用的方法。这意味着要么确定调用方法的方法很多(例如,每个类的方法必须调用if (!IsInitialized) throw ...),或者只是在代码中引入脆弱性。

任何替代解决方案都不如在构造函数中放入绝对必需的数据更健壮或更多的工作 - 这是一个构造函数参数。我的建议是,您需要重新审视您的任意要求,即构建器参数需要“保留”,以支持更具技术意义的内容。

+0

它不是任意的:我想为业务依赖项使用业务对象的构造函数,而不是将基础结构对象与业务内容混合使用。这是一个分离问题本身的问题。 – user310291 2011-04-18 10:14:24

+0

是的,但是你的“关注点分离”不属于你想要表达的地方。构造函数与属性不是你强制分离关注点的地方 - 我怀疑是你的类太少了! – 2011-04-18 12:40:15

1

你可以创建一个工厂类来接受依赖关系。

factory = new Factory(dep01, dep02); 

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

factory.Create(someBusinessObject); 

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