检查注入参数中的空值是否有意义?

时间:2015-12-16 15:02:48

标签: c# asp.net dependency-injection unity-container

我在我的应用程序中使用Unity。在构造函数中检查注入值的空值是否有意义?

public class ExampleClass
{
    public ExampleClass(IExampleArgument e)
    {
        if (e == null)
            //Do something
    }
}

参数不应该已经解决并绑定到一个值吗?如果出现问题,它应该在解析期间发生,所以我要么在这里有值,要么我没有?

3 个答案:

答案 0 :(得分:3)

  

在构造函数中为注入的值检查空值是否有意义?

绝对。

  

该参数是否已经解决并绑定到一个值?

没有什么可以迫使客户端使用注入 - 在句法上用null值调用构造函数是完全有效的。我假设一个null值会导致程序后期出现问题,所以你决定 - 你想在该构造函数中处理问题还是让它在程序的后期自然发生?

答案 1 :(得分:1)

您所指的构造是guard clause。它用于绝对确定不能使用无效值,通常是很早就失败(在DI的情况下,这是在构建DI容器期间而不是在应用程序的运行时)。

这是一项保险政策,可以防止存在空值的可能性。当您考虑可能在其他上下文中使用该类(例如单元和集成测试)时,防止可以使用无效输入的可能性是有意义的。它使整个代码库更加健壮,因为您没有在整个应用程序中散布空引用检查 - 它在输入点检查一次,并且仅在那里检查。

答案 2 :(得分:0)

当您设计课程时,您无法自动假设它将由IoC容器管理。有人可能会上课并在没有IoC的情况下使用它。因此,考虑到这一事实,保护构造函数免受null输入的影响是有意义的。

此外,我知道的容器允许注入自定义实例,甚至可以null引用。因此,如果没有构造函数的保护,这可能是可能的,但您可以有效地防止它。