我在我的应用程序中使用Unity。在构造函数中检查注入值的空值是否有意义?
public class ExampleClass
{
public ExampleClass(IExampleArgument e)
{
if (e == null)
//Do something
}
}
参数不应该已经解决并绑定到一个值吗?如果出现问题,它应该在解析期间发生,所以我要么在这里有值,要么我没有?
答案 0 :(得分:3)
在构造函数中为注入的值检查空值是否有意义?
绝对。
该参数是否已经解决并绑定到一个值?
没有什么可以迫使客户端使用注入 - 在句法上用null
值调用构造函数是完全有效的。我假设一个null
值会导致程序后期出现问题,所以你决定 - 你想在该构造函数中处理问题还是让它在程序的后期自然发生?
答案 1 :(得分:1)
您所指的构造是guard clause。它用于绝对确定不能使用无效值,通常是很早就失败(在DI的情况下,这是在构建DI容器期间而不是在应用程序的运行时)。
这是一项保险政策,可以防止存在空值的可能性。当您考虑可能在其他上下文中使用该类(例如单元和集成测试)时,防止可以使用无效输入的可能性是有意义的。它使整个代码库更加健壮,因为您没有在整个应用程序中散布空引用检查 - 它在输入点检查一次,并且仅在那里检查。
答案 2 :(得分:0)
当您设计课程时,您无法自动假设它将由IoC容器管理。有人可能会上课并在没有IoC的情况下使用它。因此,考虑到这一事实,保护构造函数免受null
输入的影响是有意义的。
此外,我知道的容器允许注入自定义实例,甚至可以null
引用。因此,如果没有构造函数的保护,这可能是可能的,但您可以有效地防止它。