如何从嵌套类通过依赖注入服务进行访问?

Posted

技术标签:

【中文标题】如何从嵌套类通过依赖注入服务进行访问?【英文标题】:How do I access through Dependency injection services from a nested class? 【发布时间】:2021-12-23 19:47:44 【问题描述】:

假设我有这段代码(一般),假设我需要在 C 类中使用 ILogger,而在 A 类和 B 类中不需要它

public class A

    var classB = new B();

public class B

    var classC = new C();

public class C

    //Here I want to use the Ilogger service

但是沿着这条整个链条通过构造函数似乎是不合理的,并且随着使用的服务的增加,构造函数只会增长。那么如何正确调用 C 类中的服务呢? 谢谢

【问题讨论】:

构造函数增长有什么问题?您仍然只关心该服务所需的依赖项。另外,我在这里看不到任何nested classes。你的标题(或例子)错了吗? 添加相关的构造函数参数,这样您就可以构造下图:new A(new B(new C(new Logger()))) 阅读What to inject and what not to inject 了解如何决定在代码中注入对象或新对象。 我之前评论中提到的文字来自Dependency Injection Principles, Practices, and Patterns这本书。请注意,Russian translation 也可用。 可能是该主题的最佳资源之一:manning.com/books/dependency-injection-in-dot-net 【参考方案1】:

如果您正在执行依赖注入,您别无选择,只能将ILogger 的实现传递给每个新的C。这是有问题的,因为如果一个类需要创建一个新的C,那么它又从哪里获得一个ILogger 实现以传入?这个问题随着每个决定它需要ILogger的类而增长。

答案通常是使用控制容器的反转,例如如今内置于 .NET 中的容器,或其他(Castle Windsor、Autofac 等)。在这种情况下,AB 不会直接调用构造函数。相反,B 将依赖于C,而A 将依赖于B。 IoC 容器将创建整个对象图,并根据需要填写所有依赖项。

public class A : IA

    private IB _b;

    public A(IB b)
    
        _b = b;
    


public class B : IB

    private IC _c;

    public B(IC c)
    
        _c = c;
    


public class C : IC

    private ILogger _logger;

    public B(ILogger logger)
    
        _logger = logger;
    

其他地方:

// Assuming A, B, C, and ILogger have all been registered with the container:
var a = Container.Resolve<IA>();

【讨论】:

以上是关于如何从嵌套类通过依赖注入服务进行访问?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套类中的依赖注入

依赖注入递归组件的用法

如何使用手动依赖注入实例化一个类?

SpringIoc依赖注入依赖反转

通过属性包装器崩溃的嵌套依赖注入

基础概念依赖注入