如何避免绕过IOC容器

时间:2012-02-06 14:18:24

标签: c# .net inversion-of-control autofac

我有一些创建类实例的遗留代码。

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

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

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

我知道这是非常不赞成的,但我想不出如何让它发挥作用。

1 个答案:

答案 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
    }
}