gpt4 book ai didi

dependency-injection - 为什么不传递你的 IoC 容器呢?

转载 作者:行者123 更新时间:2023-12-03 13:27:22 25 4
gpt4 key购买 nike

在这个 AutoFac“最佳实践”页面 (http://code.google.com/p/autofac/wiki/BestPractices) 上,他们说:

不要传递容器
让组件访问容器,或将其存储在公共(public)静态属性中,或使 Resolve() 等函数在全局“IoC”类上可用,都违背了使用依赖注入(inject)的目的。这样的设计与服务定位器模式有更多的共同点。
如果组件依赖于容器,请查看它们如何使用容器来检索服务,并将这些服务添加到组件的(依赖注入(inject)的)构造函数参数中。

那么让一个组件“动态”实例化另一个组件的更好方法是什么?他们的第二段没有涵盖“可能”需要创建的组件将取决于系统状态的情况。或者当组件 A 需要创建 X 个组件 B 时。

最佳答案

要抽象出另一个组件的实例化,您可以使用工厂模式:

public interface IComponentBFactory
{
IComponentB CreateComponentB();
}

public class ComponentA : IComponentA
{
private IComponentBFactory _componentBFactory;

public ComponentA(IComponentBFactory componentBFactory)
{
_componentBFactory = componentBFactory;
}

public void Foo()
{
var componentB = _componentBFactory.CreateComponentB();

...
}
}

然后可以将实现注册到 IoC 容器中。

容器是组装对象图的一种方式,但它肯定不是唯一的方式。这是一个实现细节。使对象不受这些知识的影响,使它们与基础设施问题脱钩。它还使他们不必知道要解决哪个版本的依赖项。

关于dependency-injection - 为什么不传递你的 IoC 容器呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1214944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com