如果我有
IMyService _myService;
public MyController(IMyService myService){
_myService = myService;
}
我正在使用说团结来解决我的依赖......
最佳做法是检查myService是否为null,如果是,我应该抛出一个excpetion还是创建一个新的具体实现?
答案 0 :(得分:3)
首先,Unity不会提供null
作为参数值。它要么创建为IMyService
注册的类型实例,要么抛出异常:
异常是:InvalidOperationException - IMyService没有的类型 有一个可访问的构造函数。
在例外时,容器是:
解析Foo.MyController,(无)
解析构造函数的参数“myService” Foo.MyController(Foo.IMyService myService)解析 Foo.IMyService,(无)
因此,Unity(或其他依赖注入框架)注入的null
无需担心。但是如果可以手动实例化控制器,则有人可能会将null
传递给构造函数。传递null
是一种非常难闻的气味 - 这意味着您的系统出现了问题。因此,最好的选择是检查服务值并抛出ArgumentNullException:
public MyController(IMyService myService)
{
if (myService == null)
throw new ArgumentNullException("myService");
_myService = myService;
}
如果注射服务应该是可选的。然后我建议你使用属性注入而不是构造函数注入。
答案 1 :(得分:1)
如果依赖项为null(在这种情况下,根据定义它不是依赖项,顺便说一下),你应该把它作为一个可选参数。
IMyService _myService;
public MyController(IMyService myService = null){
_myService = myService;
}
在所有其他情况下,抛出ArgumentNullException
。
答案 2 :(得分:1)
不,如果您正在使用DI框架,框架必须在无法解析依赖关系时抛出异常。你永远不会创建一个具体的实现,它是你的依赖项的inyector的整个使用点。想象一下你添加:
if (myServices == null) _myService = new ConcreteService()
如果您在为该控制器进行单元测试时执行此操作,如果您选择在传递空IMyService时测试该方案,则您将无法模拟该对象,因为您没有对其进行测试。