gpt4 book ai didi

inversion-of-control - StructureMap 指定显式构造函数参数

转载 作者:行者123 更新时间:2023-12-04 15:36:41 25 4
gpt4 key购买 nike

我正在处理遗留代码。

我有同一个类的不同方法,它们将不同的参数传递给依赖项的构造函数。我正在尝试介绍一些基本的 IoC 用法。现在我有 StructureMap 像这样传递我的参数:

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
new Dictionary<string, object> {
{ "constructorArgA", notShown },
{ "constructorArgB", redacted.Property } }));

为 constructorArgA 和 B 传递的实际属性根据我所在的位置而变化。

除了“constructorArgA”之外,还有一种方法可以通过实际类型来配置它,就像你在配置 objectFactory 时可以做的那样,比如:
x.For<IHidden>().Use<RealType>()
.Ctor<IConfig>().Is(new Func<IContext, IConfig>(
(context) => someMethodToGetIConfig()));

如果我从头开始编写此代码,我可能会构建一些不同的依赖关系以避免这种情况,但这不是我现在的选择。

最佳答案

这是 DI Containers 的一个经典/常见问题。

我的第一选择是创建一个“手动”抽象工厂来创建 IThingInterface,然后使用 Structuremap 在需要的地方注入(inject) IThingInterfaceFactory。通过手动工厂,我的意思是一个调用 new ThingInterface() 并返回它的类。如果你这样做,你的实现将不再是容器管理的,如果它有依赖项,它们将不再由容器提供(对你来说可能是也可能不是问题)。

第二种选择是创建一个实际使用/包装容器的抽象工厂。所以基本上是你的第一个代码片段,但包装在一个工厂类中,其中 Create() 方法接受你的参数。这样做的好处是所有内容(包括您的实现及其依赖项)都由容器管理,但缺点是直接引用您的容器(这不是最佳实践——参见 Article on Composition Roots)。

你也可以做二传手注入(inject),但我个人认为这是最后的手段。

CaSTLe Windsor 内置 (Typed Factory Facility) 有一个很好的解决方案。不确定是否在选项中切换容器,但您可能会考虑它。

关于inversion-of-control - StructureMap 指定显式构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070993/

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