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