【发布时间】:2011-03-15 22:54:42
【问题描述】:
这是一个好的模式吗?有一个工厂类知道 IUnityContainer...
我的基本需求是在运行时根据类的 Id 解析 ICalculationRuleProcess。它可能基于 ID 以外的其他内容,我知道...基本上我有一组已知的 ID 需要处理,因为我手动将记录引导到数据库中并且无法编辑记录。对于每个 ID,我都有一个相关的课程。我在每个实现 ICalculationRuleProcess 的类中也有不同数量的构造函数参数,因此与使用 Activator.CreateInstance 的一些疯狂的 switch 语句和变量构造函数参数相比,使用 IoC 容器非常有用
这是我所做的:
- 在容器本身中注册了 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() );
}
}
【问题讨论】:
标签: c# design-patterns ioc-container