2011-11-19 209 views
2

我对依赖注入有点新。我已经为一些在构造函数中传入其依赖项的类进行了设置,但是我有一些构造函数使用像Stringboolean这样的基元。显然这些需要从构造函数中删除,如果我要为该类使用依赖注入。依赖注入与非类

对于这样的情况,什么是“最佳”做法?使构造函数只取得依赖关系,并为类需要的所有基元提供setter方法?

+0

您定位哪种技术? 。净? Java的?还有别的吗? – Steven

+0

你喜欢分享一个具体的例子吗? – Steven

回答

2

我的观察是,在大多数情况下,具有构造函数的类既具有依赖性又具有基元,破坏了Single Responsibility Principle或者至少会导致不太干净的设计,从而导致容器配置更脆弱和更难了解。

在大多数情况下(如果不是全部的话),那些原语是配置值,例如连接字符串,调试选项等。

有几种方法可以改变你的设计来解决这个问题:

  1. 在这种情况下,你都打破了SRP,提取代码到它自己的类型。以this example为例,其中NotifyCustomerHandler需要string notificationServiceUrl,而该string应该已被封装成某种NotificationService
  2. 另一种选择是将类型的配置值提取到它自己的类型中。在NotifyCustomerHandler的情况下,它可能取决于INotifyCustomerHandlerConfiguration。在过去,我曾经拥有一个单一的IMyApplicationConfiguration接口,以及应用程序需要的所有配置值,但是我得出这样的结论:这是一个糟糕的主意。这打破了Interface Segregation Principle,你的单元测试将开始受到可读性和可维护性的影响。
  3. 当你没有破坏SRP并且注入一个配置对象是不实际的(当你有一个单一的原语或者获得太多配置接口,或者你只是不喜欢这个选项)时,你可以改变这些构造函数公共财产的论据。这将允许你(用大多数容器)注册一个委托,它将在创建后配置实例,编译器可以通过这种方式为你进行验证。
+0

感谢您深思熟虑的答案。我的构造函数当前接受一个包含JSON或XML的字符串。我可以将它解释为它自己的类型,也许可以是'Resource'或其他东西。但是为了让'String'进入这个类来构建'Resource',在尝试构建'Resource'对象时似乎会遇到同样的问题。看起来我唯一的选择是#3,做一个我可以设置的属性 - 这只是感觉不对。 – skaz

4

显然,这些需要从构造函数中删除,如果我使用依赖注入该类

不,“显然”。您可以保留这些参数以及具有注入的依赖关系。

如果类需要这些参数进行正确的初始化,它们需要成为构造函数的一部分。

+0

我知道显然会咬我:)所以,如果我确实需要在构造函数中,我该如何去使用依赖注入? – skaz

+0

@skaz - 你只需传递依赖关系。还是你的意思是询问IoC容器? – Oded

+0

是的,也许这是一个术语,我不知道。我试图通过在类的外部定义对象图来注入依赖关系。请参阅我对Steven的回答的评论,以了解我正在尝试做什么。谢谢你的帮助。 – skaz

1

类应该采取它需要的任何依赖关系,以执行它的功能。这两个其他服务委托一些任务,以及原始依赖(通常是一些配置值)。

任何非平凡的容器都会迎合这种情况,并允许您这样做。 Here's for example how Castle Windsor does it