如何从嵌套类通过依赖注入服务进行访问?
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 等)。在这种情况下,A
和B
不会直接调用构造函数。相反,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>();
【讨论】:
以上是关于如何从嵌套类通过依赖注入服务进行访问?的主要内容,如果未能解决你的问题,请参考以下文章