2008-10-01 48 views
5

我是一个DI新手,所以请原谅我,如果这是一个错误的方法或一个愚蠢的问题。我应该如何订购DI/IOC的ctor参数?

比方说,我有一个创建/更新订单的表单,我知道它需要检索要显示的产品和客户列表。我想传递它正在编辑的Order对象,但我也想注入ProductsService和CustomersService作为依赖关系。

所以我会希望我的IoC容器(无论哪一个去)提供服务,但它将由调用代码提供Order对象进行编辑。

我应该声明构造为接受定单对象作为第一个参数,之后的系列技术CustomersService,如:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

...还是应该依赖于最后来到第一和订单对象,例如:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

重要吗?它取决于我使用哪个IoC容器?或者,还有更好的方法?

回答

4

我不同意@ aku的回答。

我认为你在做什么很好,还有其他方法可以做到没有更多或更少的权利。例如,人们可能会质疑这个对象是否应该首先取决于服务。不管DI是什么,我觉得在你的头脑中至少要澄清每个对象所持有的状态,比如真实状态(Order),派生状态(如果有的话)以及依赖关系(服务)是有帮助的:

http://tech.puredanger.com/2007/09/18/spelunking/

在任何构造函数或方法,我更喜欢真实的数据传递第一和依赖性或外部的东西最后被通过。所以在你的例子中,我更喜欢第一个。

5

马特,你不应该混合正常参数和依赖关系。由于您的对象将在IoC容器的内部创建,您将如何指定必要的参数?

混合依赖和正常参数会使程序的逻辑更加复杂。

在这种情况下它会更好声明依赖性性质(即移除构造的依赖关系)或初始化顺序字段的IoC构造OrderForm和解决它的后依赖性(即,从构造除去正常参数)。

此外,您可以声明所有参数,包括订单作为依赖关系。

+0

好的,这是有道理的。因此,无论是对所有依赖关系使用属性注入,还是仅将依赖关系传递给ctor,并为“必要”对象引入属性? – 2008-10-01 05:22:15

+0

是的,你是对的。不要混用DP和普通属性,因为它可能导致不可预知的问题,并限制合适的IoC框架的范围。 – aku 2008-10-01 05:27:22

3

我觉得有点让人不安的是允许OrderForm的实例在没有对Order实例的必需引用的情况下实例化。其中一个原因可能是这会阻止我对空订单进行前期检查。还有什么想法?

我想我知道OrderForm对象只能通过Factory方法实例化,以确保在调用IoC框架后设置Order属性,这可能会让人感到舒服。