【问题标题】:.NET 6 DI for base class.NET 6 DI 用于基类
【发布时间】:2022-01-21 18:48:52
【问题描述】:

在 .NET 6 中出现的新特性是 DI 按类型匿名委托:

问题: 我有很多类继承自带有构造函数的基类。

现在我必须写这么长的初始化

有没有办法摆脱这种写法?比如像这样(psevdocode)

【问题讨论】:

  • 图片没有显示DI by anonymous delegate,而且你问的问题与DI无关。
  • 使用包含所有服务引用的容器类。这样,您只需为基类提供一个对象。此外,如果您需要将服务添加到基类中,只需将其添加到容器类中,而不是所有子类的构造函数中。
  • 你能分享问题中的代码而不是图像吗?图片中的代码有很多错误。您是否尝试将 null 传递给缺少参数的基本构造函数?
  • 我没有看到开头的代码和关于基类的问题之间的联系。如果容器可以解析构造函数参数,那么它就可以解析类的实例,无论它是否继承自某些东西。
  • 禁止发帖images of code

标签: c# dependency-injection .net-6.0


【解决方案1】:

这就是 minimal APIs 中的 parameter binding(在 .NET 6 中引入)的工作方式,这是由框架 (ASP.NET Core) 处理的。但这并不是全新的想法,也不受匿名 labmdas 的约束 - 从第一个 ASP.NET Core(参见applies to 部分)版本开始,就存在通过FromServicesAttribute 进行控制器操作的注入。

至于解决基类中的参数注入问题 - 一种解决方法是创建包含这些参数的类,在 DI 中注册并注入它。像这样的:

public class BaseClassParameters
{ 
    public BaseClassParameters (A a, B b, ...)  {A = a; ...}
    public A A { get; }
    ...
}

public class BaseClass
{
    public BaseClass(BaseClassParameters p) { // copy from p}
}


public class ChildClass : BaseClass
{
    public ChildClass(BaseClassParameters p): base(p) // can create ChildClassParameters : BaseClassParameters  if needed or just add deps on this level
    {
    }
}


services.AddTransient<BaseClassParameters>(); // or use needed lifetime for class hierarchy here

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 2020-07-20
    • 2023-03-17
    • 2021-03-04
    • 1970-01-01
    • 2015-04-09
    • 2012-06-11
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多