我有一些遺留代碼正在創建類的實例。如何避免繞過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