我对依赖注入有点新。我已经为一些在构造函数中传入其依赖项的类进行了设置,但是我有一些构造函数使用像String
或boolean
这样的基元。显然这些需要从构造函数中删除,如果我要为该类使用依赖注入。依赖注入与非类
对于这样的情况,什么是“最佳”做法?使构造函数只取得依赖关系,并为类需要的所有基元提供setter方法?
我对依赖注入有点新。我已经为一些在构造函数中传入其依赖项的类进行了设置,但是我有一些构造函数使用像String
或boolean
这样的基元。显然这些需要从构造函数中删除,如果我要为该类使用依赖注入。依赖注入与非类
对于这样的情况,什么是“最佳”做法?使构造函数只取得依赖关系,并为类需要的所有基元提供setter方法?
我的观察是,在大多数情况下,具有构造函数的类既具有依赖性又具有基元,破坏了Single Responsibility Principle或者至少会导致不太干净的设计,从而导致容器配置更脆弱和更难了解。
在大多数情况下(如果不是全部的话),那些原语是配置值,例如连接字符串,调试选项等。
有几种方法可以改变你的设计来解决这个问题:
NotifyCustomerHandler
需要string notificationServiceUrl
,而该string
应该已被封装成某种NotificationService
。NotifyCustomerHandler
的情况下,它可能取决于INotifyCustomerHandlerConfiguration
。在过去,我曾经拥有一个单一的IMyApplicationConfiguration
接口,以及应用程序需要的所有配置值,但是我得出这样的结论:这是一个糟糕的主意。这打破了Interface Segregation Principle,你的单元测试将开始受到可读性和可维护性的影响。感谢您深思熟虑的答案。我的构造函数当前接受一个包含JSON或XML的字符串。我可以将它解释为它自己的类型,也许可以是'Resource'或其他东西。但是为了让'String'进入这个类来构建'Resource',在尝试构建'Resource'对象时似乎会遇到同样的问题。看起来我唯一的选择是#3,做一个我可以设置的属性 - 这只是感觉不对。 – skaz
类应该采取它需要的任何依赖关系,以执行它的功能。这两个其他服务委托一些任务,以及原始依赖(通常是一些配置值)。
任何非平凡的容器都会迎合这种情况,并允许您这样做。 Here's for example how Castle Windsor does it。
您定位哪种技术? 。净? Java的?还有别的吗? – Steven
你喜欢分享一个具体的例子吗? – Steven