0

我正在使用依賴注入模式來解析我的UnitOfWork的正確實例。 當我只使用一種類型的映射,一切正常如何實例化工作

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

當我使用兩種類型映射爲同一界面中出現的問題:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 

我已經很常見代碼製作像

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 

在某些情況下,它應該返回UnitOfWork,在某些情況下,它應該返回UnitOfWork2。

如何解決此問題而不重構通用部分?

P.S.是的 - 我知道命名的容器))

回答

1

您可以使用命名實例,而不是命名容器。您可以命名實例使用Unity這樣的註冊:然後

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1"); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2"); 

,解決了正確的實例,可以使用下面的語法:

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>("MyUnit2"); 

另一個選擇是來裝飾你的另一個的UnitOfWork級與一些接口(例如IUnitOfWork2)。然後將UnitOfWork2註冊到IUnitOfWork2,並在需要時通過該新界面解析實例。

雖然你提到你不想重構ServiceLocator.GetInstance方法。我仍然認爲最簡單的方法是將可選參數添加到GetInstance方法並使用命名實例。如果沒有問題,你可以註冊一個工廠類到IUnitOfWork並使用它來獲得正確的UnitOfWork實現。以下是關於如何向Unity註冊工廠的short guide。請注意,最新版本的Unity可能有不同的做法。此外,來自Stack Overflow的here's a question處理Unity容器和工廠。

+0

感謝您的諮詢。但看起來問題更爲複雜。 – 2010-08-31 15:41:01

+0

你可以擴展你的問題嗎?也許我們可以找到另一種解決方案。 – 2010-09-01 04:15:56