这是一个好的模式吗?它有一个代码味道让我有一个工厂类知道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