【问题标题】:Validation Design Pattern验证设计模式
【发布时间】:2010-12-07 12:07:45
【问题描述】:

我正在为我们的一个部门编写一个数据验证实用程序,它有以下要求。 - 动态添加新的业务实体 - 动态地向实体添加新的验证。 - 显示业务实体列表及其验证的 UI - 用户可以选择在所有或选定的业务实体验证上开始验证。 - 如果任何验证失败,UI 将显示验证错误消息。 - 即使任何验证失败,系统也应继续进行下一次验证,因此所有配置的验证都得到验证。

在搜索互联网后,我发现以下两种有希望的设计模式可以满足我的业务需求,一种是装饰器模式,另一种是命令链(又名责任链)。现在我的问题是哪个更好?谁有更好的主意?

谢谢

【问题讨论】:

  • 我认为您可能需要重新表述您的问题。你能说清楚你想用命令链模式做什么吗?

标签: c# .net validation design-patterns


【解决方案1】:

我想你想要的是Specification Pattern。所以你会做这样的事情:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject>
{
  public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject)
  {
    return myBusinessObject.StartDate >= DateTime.Now;
  }
}

这种模式的好处是每个规则都可以轻松地单独测试,并且您可以选择何时应用验证规则(而不是某些框架将这个决定强加给您)。

【讨论】:

    【解决方案2】:

    我也在使用规范模式。这是它的基本实现。

    public class Specification<T, E> : ISpecification<T, E>
    {
        private Predicate<T> predicate;
    
        public Specification(Predicate<T> predicate)
        {
            this.predicate = predicate;
        }
    
        public bool IsSatisfiedBy(T candidate)
        {
            return this.predicate.Invoke(candidate);
        }
    }
    

    有了这个实现,我只需在构造函数中传递一个谓词,如下所示:

    var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod());
    

    我的业务对象中有几个 bool 方法,而不是几个类(我的域中每个条件一个)。

    【讨论】:

    • 能否请您添加/重写示例使用代码以包含更多解释性类/方法名称?
    猜你喜欢
    • 2012-12-30
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多