這是一個好的模式嗎?它有一個代碼味道讓我有一個工廠類知道IUnityContainer ...在工廠運行時使用Ioc容器來確定類的初始化
我的基本需求是在運行時根據類的Id解析ICalculationRuleProcess。它可能基於除Id之外的其他內容,我知道這一點......基本上我有一套我需要處理的已知ID,因爲我手動將記錄引導到數據庫中,並且無法編輯記錄。每個ID我有一個相關的類。我也有不同數量的每一個實現ICalculationRuleProcess,所以使用IoC容器類中構造函數的參數是與使用Activator.CreateInstance
這裏是一些瘋狂的switch語句和變量構造aguments非常有用的是我做過什麼:
- 在容器本身內註冊了IUnityContainer實例。我不確定這是否可能,但它的工作。
- 所有已註冊的ICalculationRuleProcess類的與註冊()內的每個可能的DistributionRule基本上只是Id.ToString()的唯一標識符
- 創建一個工廠,以確定正確ICalculationRuleProcess,並且有它使用IoC容器到找出要加載的正確類。
- 註冊的工廠類(ICalculationRuleProcessFactory)的IoC容器
- 無論在ICalculationRuleProcess需要使用,我有類採取ICalculationRuleProcessFactory在其構造和使用它調用Create方法找出使用哪個ICalculationRuleProcess。
爲出廠時的代碼是在這裏:
public interface ICalculationRuleProcessFactory
{
ICalculationRuleProcess Create(DistributionRule distributionRule);
}
public class CalculationRuleProcessFactory : ICalculationRuleProcessFactory
{
private readonly IBatchStatusWriter _batchStatusWriter;
private readonly IUnityContainer _iocContainer;
public CalculationRuleProcessFactory(
IUnityContainer iocContainer,
IBatchStatusWriter batchStatusWriter)
{
_batchStatusWriter = batchStatusWriter;
_iocContainer = iocContainer;
}
public ICalculationRuleProcess Create(DistributionRule distributionRule)
{
_batchStatusWriter.WriteBatchStatusMessage(
string.Format("Applying {0} Rule", distributionRule.Descr));
return _iocContainer.Resolve<ICalculationRuleProcess>(
distributionRule.Id.ToString());
}
}
+1我總是最終將'UnityContainer'封裝在我自己的界面中,部分原因是由於某些方法是擴展方法,因此不能通過'IUnityContainer'接口單元測試 – 2010-08-13 00:47:52