我对依赖注入有些新意。我已经为一些类设置了它们,这些类将它们的依赖项作为参数传递给构造函数,但是我有一些构造函数可以使用String
或boolean
等基元。显然,如果我要为该类使用依赖注入,则需要从构造函数中删除它们。
对于这样的案例,什么是“最佳”做法?使构造函数只接受依赖项并为该类所需的所有基元提供setter方法?
答案 0 :(得分:4)
显然,如果我要为该类使用依赖注入,这些需要从构造函数中删除
不,不是“显然”。您可以保留这些参数以及注入依赖项。
如果类需要这些参数进行正确初始化,则它们必须是构造函数的一部分。
答案 1 :(得分:2)
我的观察是,在大多数情况下,具有同时接受依赖关系和基元的构造函数的类会破坏Single Responsibility Principle或至少导致设计不那么干净,这导致容器配置更多脆弱而难以理解。
在大多数(如果不是全部)情况下,这些原语是配置值,例如连接字符串,调试选项等。
有几种方法可以改变您的设计来解决这个问题:
NotifyCustomerHandler
为string notificationServiceUrl
,其中string
需要NotificationService
,而NotifyCustomerHandler
应该被封装到某种INotifyCustomerHandlerConfiguration
。IMyApplicationConfiguration
,它可能依赖于{{1}}。在过去,我曾经有一个{{1}}接口,应用程序需要的所有配置值,但我得出结论,这是一个坏主意。这打破了this example,您的单元测试将开始受到可读性和可维护性的影响。答案 2 :(得分:1)
类应该采用它需要的任何依赖项,以便执行其功能。它委托一些任务的其他服务,以及原始依赖(通常是一些配置值)。
任何非平凡的容器都会满足这种情况,并允许您这样做。 Here's for example how Castle Windsor does it