设计使用依赖项的规则集

时间:2011-07-08 17:27:13

标签: c# oop

我有一项服务,可以在特定邮箱中收到所有电子邮件。问题是,根据电子邮件包含的内容,我们必须执行一项或多项操作。我现在有下面的烂摊子。我已经缩短了很多。实际应用目前有更多的角落案例。

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是贪婪的,任何能够承担责任的人都会执行并继续下一个要消耗的对象。另一方面,似乎没有什么能阻止策略之间的循环“嘿!我可以正确地使用这个请求,所以不要担心它。”

2 个答案:

答案 0 :(得分:2)

这似乎是Chain of responsibility的变体,可能有一些额外的逻辑来处理非排他性案例 - 如果Body以“A”开头并以“C”结尾,你打算做什么?

Chain of Resposibility的一个想法是,如果/ else链不需要大量的调度。相反,您只需向某些ICriteria实施提供电子邮件,他们有责任处理或传递给下一位候选人。

答案 1 :(得分:2)

@djna建议CoR模式的变化。我并不完全不同意。它似乎更像是战略模式的this example