Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#_Validation - Fatal编程技术网

C# 需要一个好的验证规则体系结构

C# 需要一个好的验证规则体系结构,c#,validation,C#,Validation,我希望你们能给我一些好的建议。我正在考虑如何为C#开发制作一个好的体系结构。我正在尽力解释情景,因为我不擅长英语: 1) 两类:蓝色银行和红色银行 2) 第三类:验证规则 3) 蓝色和红色银行有几个字段(值),如帐号、金额、发票期等。。。此处的示例(xml): 蓝色银行 <AccountNumber>Maria 5987593457</AccountNumber> <Amount>200.00</Amount> <InvoiceP

我希望你们能给我一些好的建议。我正在考虑如何为C#开发制作一个好的体系结构。我正在尽力解释情景,因为我不擅长英语:

1) 两类:蓝色银行和红色银行

2) 第三类:验证规则

3) 蓝色和红色银行有几个字段(值),如帐号、金额、发票期等。。。此处的示例(xml):

蓝色银行

  <AccountNumber>Maria 5987593457</AccountNumber>
  <Amount>200.00</Amount>
  <InvoicePeriod>1</InvoicePeriod>
Maria 5987593457
200
1.
红堤

  <AccountNumber>8529458</AccountNumber>
  <Amount>300.00</Amount>
  <InvoicePeriod>0</InvoicePeriod>
8529458
300
0
红色/蓝色银行有一些相同的验证规则,比如金额字段必须是数字。但红色/蓝色银行有不同的验证规则——蓝色银行中的AccountNumber字段必须是字母数字,而红色银行中的AccountNumber字段必须是数字,否则将失败。InvoicePeriod字段在红色银行中必须为默认值1,而在蓝色银行中必须为默认值0,否则失败

我的想法是:

我想为不同的验证规则创建每个红/蓝银行类,然后我还为蓝/红银行拥有的相同规则创建一个验证规则类

我的代码在这里:

蓝色银行类别:

  • 验证必须为alphanumberic的AccountNumber,否则失败
  • 验证必须为默认值1的InvoicePeriod,否则失败
红色银行类别:

  • 验证必须为numberic的AccountNumber,否则失败
  • 验证必须为默认值0的InvoicePeriod,否则失败
规则验证类

  • 验证必须为数字的金额(红色/蓝色银行类别的规则相同)
它是如何与这些课程的听写一起工作的?或者对您的示例代码有更好的建议


非常感谢你的帮助

我将使用
IRule
接口和
Validate()
方法,该方法可以在包含验证逻辑的具体验证类中实现。然后你就可以在银行里处理好几条自定义规则了。将
IRule
type对象列表传递给bank类,并对每个传递的bank参数运行
Validate()
。因此,每家银行都可以根据通过的规则进行自我验证

interface IRule
{
    bool Validate(Bank someBank);
}

abstract class Bank
{
    public string AccountNumber;
    public string Amount;
    public string InvoicePeriod;

    private List<IRule> listOfRules = new List<IRule>();

    public void ValidateAllRules(){
        foreach (var ite in listOfRules){
            ite.Validate(this);
            //if validation will not pass then I don't know what you want to do ;)
        }
    }

    public void AddRule(IRule rule)
    {
        listOfRules.Add(rule);
    }
}

class RedBank : Bank
{
    public RedBank(){
        listOfRules.Add(new SimpleRule());
        listOfRules.Add(new SimpleRule2());
    }
}

class SimpleRule : IRule
{
    public bool Validate(Bank someBank)
    {
        return someBank.AccountNumber.Contains("567");
    }
}

class SimpleRule2 : IRule
{
    public bool Validate(Bank someBank)
    {
        return someBank.Amount.Contains(".") && someBank.InvoicePeriod.Contains("-");
    }
}
interface-IRule
{
bool验证(银行someBank);
}
抽象类库
{
公共字符串AccountNumber;
公共字符串数量;
公共字符串InvoicePeriod;
私有列表listOfRules=新列表();
公共void ValidateAllRules(){
foreach(列表规则中的变量){
验证(此);
//如果验证无法通过,那么我不知道您想做什么;)
}
}
公共无效添加规则(IRule规则)
{
添加(规则);
}
}
类别:银行
{
公共红库(){
添加(新的SimpleRule());
Add(新的SimpleRule2());
}
}
类SimpleRule:IRule
{
公共bool验证(银行someBank)
{
返回someBank.AccountNumber.Contains(“567”);
}
}
类SimpleRule2:IRule
{
公共bool验证(银行someBank)
{
返回someBank.Amount.Contains(“.”)和someBank.InvoicePeriod.Contains(“-”);
}
}
是解决您的问题的好方法。您可以为通用银行规则创建规范类,并为每个特定需求创建其他规范类

此模式有一些c#库:


您应该使用System.ComponentModel.DataAnnotations

首先创建抽象类库

abstract class Bank
{
    #region fields
    private List<string> errorMessages = new List<string>();
    #endregion

    #region publioc methods
    public virtual void Validate()
    {
        ValidateRulesAtributes();
    }

    #endregion

    #region helper methods
    private void ValidateRulesAtributes()
    {
        var validationContext = new ValidationContext(this, null, null); //ValidationContext -> Reference System.ComponentModel.DataAnnotations
        var result = new List<ValidationResult>();
        Validator.TryValidateObject(this, validationContext, result, true);



        result.ForEach(p => { errorMessages.Add(p.ErrorMessage); });

        if (errorMessages.Any())
            throw new Exception(errorMessages.Aggregate((m1, m2) => String.Concat(m1, Environment.NewLine, m2)));
    }

    protected void Validate(List<string> messages)
    {
        if (errorMessages == null)
            errorMessages = new List<string>();

        if (messages != null)
            messages.ForEach(p => { errorMessages.Add(p); });
        ValidateRulesAtributes();

    }
    #endregion
    #region properties
    //Abstract to indicate Validation atributes 

    public abstract string AccountNumber { get; set; }

    public abstract double Amount { get; set; }
    public abstract int InvoicePeriod { get; set; }
    #endregion

}

为了验证,你可以看一看界面,看一个不知道模式的例子,它很可爱,我喜欢你的建议。也许你能在这里给我一个很好的例子,这样我就能在脑海中看到一幅清晰的画面。如果你不介意的话:-)类似这样的东西,看起来有点像giacomelli发布的规范模式。你应该接受或投票回应,而不是感谢你的评论;)
class BlueBank : Bank
    {
        //All is ok, no validate 
        public override string AccountNumber { get; set; }

        public override double Amount { get; set; }

        public override int InvoicePeriod { get; set; }

    }
class RedBank : Bank
    {
        [Required()]
        public override string AccountNumber { get; set; }

        public override double Amount { get; set; }
        [Range(0,0)]
        public override int InvoicePeriod { get; set; }


        public override void Validate()
        {
            List<string> errors=new List<string>();
            if (AccountNumber != "Test")
                errors.Add("Worng Account");
            base.Validate(errors);
        }

    }
class Program
    {
        static void Main(string[] args)
        {
            RedBank red = new RedBank();
            red.AccountNumber = "Test";

            red.Amount=0;
            red.Validate(); //this No fail

            red.InvoicePeriod = 3; //This Fail;
            red.Validate(); 

            red.AccountNumber = "PD";
            red.Validate(); //this fal:

        }
    }