2012-02-06 43 views
1

我有一些遗留代码正在创建类的实例。如何避免绕过IOC容器

我设法连接一个IOC容器来扫描程序集并创建它们的实例。但是,我发现在一个配置类中可能会创建许多次特定的类。

该逻辑基本上循环遍历类类型的数组,如果它匹配用户选择的那个,则调用CreateInstance

这很好,但我认为提供该功能的唯一方法是传递IOC容器并调用Resolve,它将提供该类的新实例。

我知道这是严重皱眉,但我想不出如何使它工作。

+0

是否有一个理由,为什么你不能使用这些依赖构造注塑模式? – Dervall 2012-02-06 14:21:19

+0

大约有50个类的类,这些是插件。用户可以将一个插件拖动到他们的屏幕上,当他们做一个新实例需要创建时 – Jon 2012-02-06 14:23:08

+0

由于您正在使用旧代码,因此使用DI容器来实现此目的可能是合理的第一步。但是,这不是你想要结束的地方。 – 2012-02-06 15:27:59

回答

1

创建一个抽象工厂,它在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 
    } 
} 
+0

我正在使用Autofac并试图找到一种方法来做到这一点... – Jon 2012-02-06 14:44:04

+0

从阅读,我相信Autofac是能够这完全相同的功能。看到[这里](http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory) – Lukazoid 2012-02-06 14:51:41

+0

是阅读文档,但我只是看到等等,等等,等等:) – Jon 2012-02-06 14:53:27