我有一些创建类实例的遗留代码。
我设法连接一个IOC容器来扫描程序集并创建它们的实例。但是,我发现在配置类中,可能会多次创建特定的类。
逻辑基本上循环遍历类类型数组,如果它与用户选择的类匹配则调用CreateInstance
。
这很好,但我能想到提供该功能的唯一方法是传递IOC容器并调用Resolve,它将提供该类的新实例。
我知道这是非常不赞成的,但我想不出如何让它发挥作用。
答案 0 :(得分:1)
创建一个抽象工厂,它在IOC容器和需要新实例的代码之间提供一个抽象层,这样可以避免代码被依赖于容器的调用。
例如,使用“Unity应用程序块”时,Func<T>
可用作工厂。然后,此Func<T>
隐藏了实际为container.Resolve<T>()
的容器实现。
<强>更新强>
以下是一个例子:
public class TestClass
{
readonly Func<Foo> _fooFactory;
public TestClass(Func<Foo> fooFactory)
{
_fooFactory = fooFactory;
}
public void LoadFoo()
{
var foo = _fooFactory(); // This hides the call container.Resolve<Foo>()
// Do something with foo
}
}