繁体   English   中英

在ASP.NET Core DI容器中注入一条记录是否可以?

[英]Is it ok to inject a record in the ASP.NET Core DI container?

记录使我的代码更短。 例如,而不是

public class OrderService
{
  private readonly EcommerceContext _context;

  public OrderService(EcommerceContext context)
  {
    _context = context;
  }
}

我只有

public record OrderService(EcommerceContext Context)

所以,我的问题是,在 DI 容器中注入一条记录是否可以,或者它有什么缺点吗?

一条记录只是一个带有自动生成的构造函数的 class; DI 容器不区分它们两者。

就我个人而言,我发现记录类型是一种消除实践 DI 和松散耦合所需的基础结构代码/垃圾的好方法。 私有字段、构造函数和私有字段分配只是允许我们的代码松散耦合所需的样板代码。 记录允许将此代码减少到最低限度,这很棒。

记录类型的唯一缺点是,对于 C# 的当前版本,无法防止传入的依赖项成为null 对我来说,在大多数情况下这没什么大不了的,在这种情况下我喜欢使用记录类型。 如果 null 检查是强制性的(例如因为您正在编写一个可重用的库,例如您通过 NuGet 发送的东西),您需要回退到使用手动实现的构造函数的老式类。

在撰写有关 DI 的书时,Mark Seemann 和我实际上讨论了使用记录类型作为我们书中构造函数注入的主要演示。 然而,我们决定不在我们的书中使用记录类型,主要出于三个原因:

  • 在发布时,包含记录类型的 C# 9 尚不可用
  • 丧失进行前提条件检查的能力是本书示例的一大障碍,因为我们不想假设 DI 容器用于组合实例; 还有一种称为Pure DI的实践,我们在本书中对其进行了广泛描述。 使用 Pure DI,没有工具可以保证不将null值注入构造函数。
  • 我们希望这本书对于使用其他 OOP 语言的开发人员来说也是可读的。 尽管记录类型将在几年内在 C# 社区中非常普遍,但对于许多其他 OOP 语言来说情况可能并非如此。

也许我们会在本书的(假设的)第三版中改变主意。 当 C# 的未来版本允许记录类型构造函数自动检查(并阻止)null arguments 时,尤其可能会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM