【发布时间】:2017-03-07 20:09:56
【问题描述】:
我在应用程序中使用 .net 统一依赖注入框架。
该项目使用了一些“第三方库”(由同一公司的其他团队编写的库)
我以这种方式注册了我的第三方库的一些“汽车”类:
unityContainer.RegisterType<ICar,Car>();
现在,开发 'Car' 类的人认为,如果构造函数在构造函数中采用布尔值会更好。
当我获得他们的库的新版本时,我的代码在运行时中断(我无法检测到构建管道中的错误):
解析构造函数 Car 的参数“hasRadio” 正在解析 System.Boolean,(none)\r\n","exceptionType":"Microsoft.Practices.Unity.ResolutionFailedException"...
所以我的问题是,您将如何避免此类问题?
引入诸如“不要在构造函数中使用原语”之类的规则是否是最佳实践?
是不是我的测试覆盖率不够好?例如,当类构造函数包含一些原语时,我是否应该检查我的统一依赖图的所有类是否都使用 InjectionConstructor 实例化? (我什至不确定是否可以使用 UnityContainer 来做到这一点,它的 Registrations 字段不会返回 InjectionConstructors)
我是否应该始终显式地从第三方库中实例化类(使用 InjectionFactory),以确保当其他团队更改构造函数而不更改我的代码时构建管道失败? (我对这个选项不太满意,因为它有点违反依赖注入原则:/)
【问题讨论】:
-
是的,你的单元测试覆盖率不够好——你应该有单元测试来检查类型是否可以像生产代码那样实例化(在你的情况下是通过 Unity),因此正在改变新库的版本应该在构建时被拒绝...您将如何解决其他库不方便您选择的 DI 容器这一事实取决于您...(您显然看到 stackoverflow.com/questions/787001/… 传递构造函数参数。 ..)
标签: c# dependency-injection inversion-of-control unity-container