C# 类构造函数前置条件

标签 c# ninject ioc-container

假设我有一个类,有一个构造函数

public RepresentativeService(IUserContext userContext, INavServiceClient navServiceClient)
{
    _userContext = userContext;
    _navServiceClient = navServiceClient;
}

我想添加前提条件

if (userContext == null) throw new ArgumentNullException(nameof(userContext));
if (navServiceClient == null) throw new ArgumentNullException(nameof(navServiceClient));
if (string.IsNullOrEmpty(userContext.CustomerNumber)) throw new ArgumentNullException(nameof(userContext.CustomerNumber));
if (string.IsNullOrEmpty(userContext.PersonalCode)) throw new ArgumentNullException(nameof(userContext.PersonalCode));

确保服务方法能够正常工作。此外,向方法添加条件是没有意义的,例如

public void Appoint(PrivatePerson person)

不应检查 userContext 是否为 null 或者它需要的某个值是否为 String.Empty。向构造函数添加先决条件可能是一个糟糕的决定,但另一方面它会很快失败并给出正确的精确错误。

Service 只是 web 服务的一个门面,来自第 3 方。在没有先决条件的情况下,我允许用户说类似的话:“删除具有 null id 的代表”,这似乎不正确。如果我不添加它们,那么为它们添加单元/集成测试也没有意义。

我的问题是:我应该添加前提条件吗?在哪里添加?

最佳答案

在构造函数中添加前置条件通常是个好主意。您正在保护您的不变量。您不希望有人以不良状态实例化您的类。例如,当某物不能为 null 时,它为 null。您还应该向在方法的上下文中有意义的方法添加前提条件。在您的示例中,检查 person 是否为空。

public void Appoint(PrivatePerson person)
{
   if (person == null)
   {
       throw new ArgumentNullException(nameof(person));
   }

   // code
}

这也称为防御性编程。您假设代码的调用者向您传递了不寻常的参数,因此您检查代码中是否存在无效参数。这是非常好的做法。

关于测试,您应该在单元测试中测试您的先决条件。您的先决条件是代码执行流程的一部分。如果您不在测试中使用它们,则无法确定它们是否按预期工作。

总而言之,在任何你想保证正确对象状态的地方添加前置条件,这通常无处不在。

关于C# 类构造函数前置条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33690308/

相关文章:

c# - 如何处理此类问题 UnauthorizedAccessException Was handli Error?

asp.net-mvc - 在 MVC 项目中将 Azure 与 Ninject InSessionScope 类结合使用

c# - 主要的 C# DI/IoC 框架如何比较?

caSTLe-windsor - 使用不是为 IOC 设计的遗留应用程序避免服务定位器反模式

ioc-container - 我应该封装我的 IoC 容器吗?

c# - SQL删除具有多个标识符的多行

C# 更新 DLL 而无需重新编译项目

c# - cshtml 中的百分比标签

c# - 试图让 ninject 和 signalR 正常工作

c# - Ninject 泛型集合的隐式构造函数绑定(bind)错误