Ada*_*kis 6 structuremap ioc-container inversion-of-control
我正在研究遗留代码.
我有相同类的不同方法,它们将不同的参数传递给依赖项的构造函数.我正在尝试引入一些基本的IoC用法.现在我让StructureMap像这样传递我的参数:
var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
new Dictionary<string, object> {
{ "constructorArgA", notShown },
{ "constructorArgB", redacted.Property } }));
Run Code Online (Sandbox Code Playgroud)
为constructorArgA和B传递的实际属性取决于我的位置.
而不是"constructorArgA"有一种方法可以通过实际类型配置它,就像配置objectFactory时一样,如:
x.For<IHidden>().Use<RealType>()
.Ctor<IConfig>().Is(new Func<IContext, IConfig>(
(context) => someMethodToGetIConfig()));
Run Code Online (Sandbox Code Playgroud)
如果我从头开始编写这个,我可能会将依赖关系构建得有点不同以避免这种情况,但这对我来说不是一个选择.
这是 DI 容器的一个经典/常见问题。
我的第一个选择是创建一个“手动”抽象工厂来创建 IThingInterface,然后使用 Structuremap 在需要的地方注入 IThingInterfaceFactory。通过手动工厂,我的意思是一个调用 new ThingInterface() 并返回它的类。如果您这样做,您的实现将不再由容器管理,并且如果它具有依赖项,则容器将不再提供它们(对您来说可能是问题,也可能不是问题)。
第二个选择是创建一个实际使用/包装容器的抽象工厂。因此,基本上是您的第一个代码片段,但包装在一个工厂类中,其中 Create() 方法获取您的参数。这样做的优点是所有内容(包括您的实现及其依赖项)都由容器管理,但缺点是直接引用容器(这不是最佳实践 - 请参阅有关组合根的文章)。
您也可以进行 setter 注入,但我个人认为这是最后的手段。
温莎城堡内置了一个很好的解决方案来解决这个问题(类型化工厂设施)。不确定是否可以在选项中切换容器,但您可能会考虑它。
| 归档时间: |
|
| 查看次数: |
2156 次 |
| 最近记录: |