gpt4 book ai didi

.net - 在 .net 中验证数据

转载 作者:行者123 更新时间:2023-12-01 13:06:51 24 4
gpt4 key购买 nike

我正在寻找任何推荐的验证框架或 N 层客户端应用程序的模式,我想编写一次验证方法并将其绑定(bind)到 WPF GUI,如果可能的话还用于服务器端和客户端相关业务逻辑。

最佳答案

很简单,您的业务实体应该包含一个部分来存储业务验证(即业务逻辑)。无论您是在设计基于 Web 的应用程序、基于客户端的应用程序、移动应用程序等,这都适用。非常灵活。

假设您有一个像客户这样的业务对象(实体):

public class Customer
{
public Customer(int customerId, string company, string city, string country)
{
CustomerId = customerId;
Company = company;
City = city;
Country = country;
}
}

然后你意识到你希望你的业务逻辑声明你验证一个客户ID(此外它> 0),你需要一个公司名称(没有一个客户是无效的)等等。这些验证是你的业务逻辑层。因此,您可以更改您的客户类以继承自 BusinessObject 层,这样您的类就变成了这样:

    public class Customer : BusinessObject
{
/// <summary>
/// Default constructor for customer class.
/// Initializes automatic properties.
/// </summary>
public Customer()
{
// Default property values
Orders = new List<Order>();

// Business rules
AddRule(new ValidateId("CustomerId"));

AddRule(new ValidateRequired("Company"));
AddRule(new ValidateLength("Company", 1, 40));

}

/// <summary>
/// Overloaded constructor for the Customer class.
/// </summary>
/// <param name="customerId">Unique Identifier for the Customer.</param>
/// <param name="company">Name of the Customer.</param>
/// <param name="city">City where Customer is located.</param>
/// <param name="country">Country where Customer is located.</param>
public Customer(int customerId, string company, string city, string country)
: this()
{
CustomerId = customerId;
Company = company;
City = city;
Country = country;
}
//much more code like methods...
}

您不需要 BusinessObject 类型的对象,但 businessobject 用作​​存储验证错误和业务规则的抽象类。业务规则最终是您在调用 AddRule 时声明的规则:

public abstract class BusinessObject
{
/// <summary>
/// Default value for version number (used in LINQ's optimistic concurrency)
/// </summary>
protected static readonly string _versionDefault = "NotSet";

// List of business rules
private IList<BusinessRule> _businessRules = new List<BusinessRule>();

// List of validation errors (following validation failure)
private IList<string> _validationErrors = new List<string>();

/// <summary>
/// Gets list of validations errors.
/// </summary>
public IList<string> ValidationErrors
{
get { return _validationErrors; }
}

/// <summary>
/// Adds a business rule to the business object.
/// </summary>
/// <param name="rule"></param>
protected void AddRule(BusinessRule rule)
{
_businessRules.Add(rule);
}

/// <summary>
/// Determines whether business rules are valid or not.
/// Creates a list of validation errors when appropriate.
/// </summary>
/// <returns></returns>
public bool Validate()
{
bool isValid = true;

_validationErrors.Clear();

foreach (BusinessRule rule in _businessRules)
{
if (!rule.Validate(this))
{
isValid = false;
_validationErrors.Add(rule.ErrorMessage);
}
}
return isValid;
}
}

需要实现validateid、validaterequired、validatelength等业务规则:

public class ValidateId : BusinessRule
{
public ValidateId(string propertyName)
: base(propertyName)
{
ErrorMessage = propertyName + " is an invalid identifier";
}

public ValidateId(string propertyName, string errorMessage)
: base(propertyName)
{
ErrorMessage = errorMessage;
}

public override bool Validate(BusinessObject businessObject)
{
try
{
int id = int.Parse(GetPropertyValue(businessObject).ToString());
return id >= 0;
}
catch
{
return false;
}
}

public class ValidateLength : BusinessRule
{
private int _min;
private int _max;

public ValidateLength(string propertyName, int min, int max)
: base(propertyName)
{
_min = min;
_max = max;

ErrorMessage = propertyName + " must be between " + _min + " and " + _max + " characters long.";
}

public ValidateLength(string propertyName, string errorMessage, int min, int max)
: this(propertyName, min, max)
{
ErrorMessage = errorMessage;
}

public override bool Validate(BusinessObject businessObject)
{
int length = GetPropertyValue(businessObject).ToString().Length;
return length >= _min && length <= _max;
}
}

这只是 validatelength 和 validateid 的两个示例,您可以提出 validaterequired(检查该值是否存在)。他们都实现了一个业务规则类:

public abstract class BusinessRule
{
public string PropertyName { get; set; }
public string ErrorMessage { get; set; }

/// <summary>
/// Constructor
/// </summary>
/// <param name="propertyName">The property name to which rule applies.</param>
public BusinessRule(string propertyName)
{
PropertyName = propertyName;
ErrorMessage = propertyName + " is not valid";
}

/// <summary>
/// Overloaded constructor
/// </summary>
/// <param name="propertyName">The property name to which rule applies.</param>
/// <param name="errorMessage">The error message.</param>
public BusinessRule(string propertyName, string errorMessage)
: this(propertyName)
{
ErrorMessage = errorMessage;
}

/// <summary>
/// Validation method. To be implemented in derived classes.
/// </summary>
/// <param name="businessObject"></param>
/// <returns></returns>
public abstract bool Validate(BusinessObject businessObject);

/// <summary>
/// Gets value for given business object's property using reflection.
/// </summary>
/// <param name="businessObject"></param>
/// <param name="propertyName"></param>
/// <returns></returns>
protected object GetPropertyValue(BusinessObject businessObject)
{
return businessObject.GetType().GetProperty(PropertyName).GetValue(businessObject, null);
}
}

因此您的 businessobject 类只保留所需业务规则的列表和它捕获的验证错误。业务规则类仅存储属性名称和一条错误消息,以防规则未正确应用。它还包含为每个验证类定义的抽象 validate() 方法。每个验证类都不同,因为验证 id 与验证必填字段不同。

gang of four website在这方面有很多很好的帮助。大部分代码取自他们的模型。

关于.net - 在 .net 中验证数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com