2012-02-06 41 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