我有一些遗留代码正在创建类的实例。如何避免绕过IOC容器
我设法连接一个IOC容器来扫描程序集并创建它们的实例。但是,我发现在一个配置类中可能会创建许多次特定的类。
该逻辑基本上循环遍历类类型的数组,如果它匹配用户选择的那个,则调用CreateInstance
。
这很好,但我认为提供该功能的唯一方法是传递IOC容器并调用Resolve,它将提供该类的新实例。
我知道这是严重皱眉,但我想不出如何使它工作。
我有一些遗留代码正在创建类的实例。如何避免绕过IOC容器
我设法连接一个IOC容器来扫描程序集并创建它们的实例。但是,我发现在一个配置类中可能会创建许多次特定的类。
该逻辑基本上循环遍历类类型的数组,如果它匹配用户选择的那个,则调用CreateInstance
。
这很好,但我认为提供该功能的唯一方法是传递IOC容器并调用Resolve,它将提供该类的新实例。
我知道这是严重皱眉,但我想不出如何使它工作。
创建一个抽象工厂,它在IOC容器和需要新实例的代码之间提供一个抽象层,这将避免代码被依赖于容器的调用所抛弃。
例如,使用'Unity Application Block'时,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
}
}
是否有一个理由,为什么你不能使用这些依赖构造注塑模式? – Dervall 2012-02-06 14:21:19
大约有50个类的类,这些是插件。用户可以将一个插件拖动到他们的屏幕上,当他们做一个新实例需要创建时 – Jon 2012-02-06 14:23:08
由于您正在使用旧代码,因此使用DI容器来实现此目的可能是合理的第一步。但是,这不是你想要结束的地方。 – 2012-02-06 15:27:59