我需要处理从服务返回的记录列表。
然而,记录的处理算法根据记录上的某个字段而完全改变。
为了实现这一点,我定义了一个 IProcessor 接口,它只有一个方法:
public interface IProcessor
{
ICollection<OutputEntity> Process(ICollection<InputEntity>> entities);
}
我有两个具体的实现IProcessor
用于不同类型的加工。
问题是我需要使用的所有实现IProcessor
同时..那么我该如何注入IProcessor
进入我的 Engine 类来驱动整个事情:
public class Engine
{
public void ProcessRecords(IService service)
{
var records = service.GetRecords();
var type1Records = records.Where(x => x.SomeField== "Type1").ToList();
var type2Records = records.Where(x => x.SomeField== "Type2").ToList();
IProcessor processor1 = new Type1Processor();
processor.Process(type1Records);
IProcessor processor2 = new Type2Processor();
processor.Process(type2Records);
}
}
这就是我目前正在做的事情..它看起来不漂亮也不干净。
关于如何改进这个设计的任何想法..也许使用 IoC?
改变你的IProcessor
接口,并添加一个新功能:
public interface IProcessor
{
ICollection<OutputEntity> Process(InputEntity> entity);
bool CanProcess (InputEntity entity);
}
那么您的代码不需要了解有关实现的任何信息:
foreach (var entity in entities) {
var processor = allOfMyProcessors.First(p=>p.CanProcess(entity));
processor.Process(entity);
}
您的处理器将发挥神奇作用:
public class Processor1 : IProcessor {
public bool CanProcess(InputEntity entity) {
return entity.Field == "field1";
}
}
这种方法的好处是,您可以从程序集等加载新处理器,而您的主代码实现不必了解任何单个实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)