仅在单个方法中使用对象的依赖注入方法

问题描述 投票:0回答:1

我正在将旧的 ASP.NET 4.7.2 MVC 应用程序迁移到 ASP.NET Core,并希望了解更多有关 DI 方法的信息,因为它已经深度集成到 Core 框架中。然而,到目前为止,我在使用它时遇到了一些问题。我知道 DI 应该在整个调用链中使用,每个类都注入其依赖项。但是,如果您只想在当前类的特定方法中使用类的实例,该怎么办?您是否应该为整个班级注入它,在不必要的时候将性能浪费在潜在的繁重实例化上?

这是一个例子;

public class TestClass(ILogger<TestClass> logger)
{
    public void DoSomething()
    {
        // Do work here
    }

    public void DoAnotherThing()
    {
        // Do work here
    }

    private void CallSomethingFromInnerClass()
    {
        // Problematic code
        new InnerClass().DoInnerClassWork();
    }
}

public class InnerClass(ILogger<InnerClass> logger)
{
    public void DoInnerClassWork()
    {
        // Do work here
    }
}

我有一个有很多方法的类,每个方法都做自己的事情。假设该类不能拆分为不同的较小类,它可能是一个控制器。内部类需要一个具有自己类别的记录器。现在,我可以在方法中实例化它并传递现有记录器,但该记录器将具有错误的类别(

TestClass
而不是
InnerClass
)。我也可以注入一个
IServiceProvider
,但是据我了解这是一种反模式,在实现 DI 时不应该这样做。 我还可以引入一个
[FromService]
属性,但这也是一种反模式,而且它仅适用于从环境调用的控制器操作,不适用于私有方法。

另一种方法是将方法确实分离到不同的对象(参见this)。然而,这不是只是把罐头踢到路上吗?如果您需要注入该对象来调用该方法,那么整个 TestClass 是否仍然会发生注入?

这里最好的方法是什么?答案真的是为全班注入的吗?如果内部类是ORM助手,我每次都需要创建数据库连接吗?

c# asp.net asp.net-core dependency-injection
1个回答
0
投票

延迟初始化就是在这种情况下使用的,它也可以应用于 DI 上,参见 => 延迟初始化

© www.soinside.com 2019 - 2024. All rights reserved.