我有一项服务,可以在特定邮箱中收到所有电子邮件。问题是,根据电子邮件包含的内容,我们必须执行一项或多项操作。我现在有下面的烂摊子。我已经缩短了很多。实际应用目前有更多的角落案例。
var email = new Email { Body = "Some random email body text..." };
if(email.Body.StartsWith("A"))
{
// Requires a dependency on INotifier
Console.WriteLine("Notifying administrator");
}
if (email.Body.StartsWith("B"))
{
// Requires a dependency on IParser and IRepository
Console.WriteLine("Parsing email and adding to database");
}
if (email.Body.EndsWith("C"))
{
// Requires a dependency on ISender and INotifier
Console.WriteLine("Forwarding email and notifying administrator");
}
if (email.Body.EndsWith("C"))
{
// Requires a dependency on INotifier
Console.WriteLine("Ignoring email");
}
基本上,如果满足条件,则必须使用一个或多个依赖项执行关联操作。这些依赖项是我想在构造函数中注入的东西。
我想过要创建这样的东西:
public class AdministratorNotififerCriteria : ICriteria
{
private readonly INotifier _notifier;
public AdministratorNotififerCriteria(INotifier notifier)
{
_notifier = notifier;
}
private void Execute()
{
_notifier.Notify();
}
public void CheckSatisfaction(Email email)
{
if(email.Body.StartsWith("A"))
Execute();
}
}
底线是我希望制作可组合命令。因此,当我在行中添加另一个标准时,我所要做的就是继承ICriteria
(或其他)并让应用程序弄明白。
所有这些都有名称吗?
我目前有一个类似于此的消费者。
public class EmailConsumer
{
private readonly IEnumerable<ICriteria> _criterias;
// Criterias are found and injected with Windsor from all classes inheriting the ICriteria interface
public EmailConsumer(IList<ICriteria> criterias)
{
_criterias = criterias;
}
public void Consume(IList<Email> emails)
{
foreach(var criteria in _criterias)
{
foreach(var email in emails)
{
criteria.CheckSatisfaction(email);
}
}
}
}
感谢回复,IAbstract和djna。我现在明白策略和CoR模式的作用,并考虑哪个更合适,证明我对当前的问题不够了解。
我理解的方式是CoR是贪婪的,任何能够承担责任的人都会执行并继续下一个要消耗的对象。另一方面,似乎没有什么能阻止策略之间的循环“嘿!我可以正确地使用这个请求,所以不要担心它。”
答案 0 :(得分:2)
这似乎是Chain of responsibility的变体,可能有一些额外的逻辑来处理非排他性案例 - 如果Body以“A”开头并以“C”结尾,你打算做什么?
Chain of Resposibility的一个想法是,如果/ else链不需要大量的调度。相反,您只需向某些ICriteria实施提供电子邮件,他们有责任处理或传递给下一位候选人。
答案 1 :(得分:2)
@djna建议CoR模式的变化。我并不完全不同意。它似乎更像是战略模式的this example。