Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证设计模式_C#_.net_Validation_Design Patterns - Fatal编程技术网

C# 验证设计模式

C# 验证设计模式,c#,.net,validation,design-patterns,C#,.net,Validation,Design Patterns,我正在为我们的一个部门编写一个数据验证实用程序,该部门有以下要求。 -动态添加新业务实体 -向实体动态添加新验证。 -显示业务实体及其有效性列表的UI -用户可以选择对所有或选定的业务实体validaiton启动验证。 -如果任何验证失败,UI将显示验证错误消息。 -即使任何验证失败,系统也应继续进行下一次验证,从而验证所有配置的验证 在搜索互联网后,我发现以下两种符合我业务需求的promissing设计模式:一种是id装饰模式,另一种是命令链(也称为责任链)。现在我的问题是哪一个更好?有人有更

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

在搜索互联网后,我发现以下两种符合我业务需求的promissing设计模式:一种是id装饰模式,另一种是命令链(也称为责任链)。现在我的问题是哪一个更好?有人有更好的主意吗


谢谢

我想你想要的是。所以你可以这样做:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject>
{
  public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject)
  {
    return myBusinessObject.StartDate >= DateTime.Now;
  }
}
var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod());
public void startDateNotInCastSpecification:isSpecification
{
公共bool由(ISomeBusinessObject myBusinessObject)满足
{
返回myBusinessObject.StartDate>=DateTime.Now;
}
}

这个模式的好处是,每个规则都可以很容易地单独测试,您可以选择何时应用验证规则(与一些将此决定强加给您的框架相反)。

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

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);
    }
}
公共类规范:i规范
{
私有谓词;
公共规范(谓词)
{
this.predicate=谓词;
}
公共学校(T候选人)满意
{
返回this.predicate.Invoke(候选者);
}
}
在这个实现中,我只需在构造函数中传递一个谓词,如下所示:

public void StartDateNotInPastSpecification : ISpecification<ISomeBusinessObject>
{
  public bool IsSatisfiedBy(ISomeBusinessObject myBusinessObject)
  {
    return myBusinessObject.StartDate >= DateTime.Now;
  }
}
var specification = new Specification<SomeDomainClass>(x => x.SomeDomainBoolMethod());
var规范=新规范(x=>x.SomeDomainBoolMethod());

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

我想您可能需要重新表述您的问题。你能清楚地说明你想用命令链模式做什么吗?你能添加/重写示例使用代码以包含更多解释性的类/方法名吗?