在设计业务对象时是否存在标准约定,以便为消费者提供发现约束(如属性的最大长度)的方法?
它可以在UI层中用完,例如,根据业务对象中的最大长度限制设置Textbox的MaxLength属性。
这是否有标准的设计方法?
答案 0 :(得分:1)
验证框架通常包含用于与UI技术集成以传达错误的部分。例如Microsoft Enterprise Library Validation Application Block包含一个WinForms的ValidationProvider扩展器控件,它与WinForms ErrorProvider控件绑定。
你的愿望虽然不同。您希望在它们转入错误之前传达约束。因为这不是一个标准要求,我不相信大多数验证框架都有开箱即用的东西。但是,根据所选择的框架创建,这可能是可以实现的。例如,验证应用程序块允许您分析在实体上注册/配置的规则。因此,可以构建一个可以为您完成此操作的控件。
[编辑] 您还可以做的是在启动时和每次击键后立即验证表格。这会导致错误图标或消息立即显示,这允许用户直接查看约束是什么(当您使用图标时,用户可以悬停图标以查看错误消息)。这可能不如创建自己的控件那么好,但实现起来要容易得多。
答案 1 :(得分:0)
我有自己的验证框架,可以让我在指定的ValidationAttribute的帮助下验证每个字段。它使用Attributes来自动化大多数验证。
示例业务对象在我的应用程序中看起来像这样。
每个业务对象都将从EntityBase抽象类继承,该抽象类具有名为“Validate()”的公共方法。当在业务对象的给定实例上调用此方法时,它将遍历其自身的所有属性,其具有从ValidationAttribute派生的属性,可以调用ValidationAttriubte的IsValid方法来验证关联的proerty的值,并使用err返回true / false。 msg,如果有的话。
<强> User.cs 强>
[TableMapping("Users")]
public class User : EntityBase
{
#region Constructor(s)
public AppUser()
{
BookCollection = new BookCollection();
}
#endregion
#region Properties
#region Default Properties - Direct Field Mapping using DataFieldMappingAttribute
private System.Int32 _UserId;
private System.String _FirstName;
private System.String _LastName;
private System.String _UserName;
private System.Boolean _IsActive;
[DataFieldMapping("UserID")]
[DataObjectFieldAttribute(true, true, false)]
[NotNullOrEmpty(Message = "UserID From Users Table Is Required.")] // VALIDATION ATTRIBUTE
public override int Id
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
[DataFieldMapping("UserName")]
[Searchable]
[NotNullOrEmpty(Message = "Username Is Required.")] // VALIDATION ATTRIBUTE
public string UserName
{
get
{
return _UserName;
}
set
{
_UserName = value;
}
}
[DataFieldMapping("FirstName")]
[Searchable]
public string FirstName
{
get
{
return _FirstName;
}
set
{
_FirstName = value;
}
}
[DataFieldMapping("LastName")]
[Searchable]
public string LastName
{
get
{
return _LastName;
}
set
{
_LastName = value;
}
}
[DataFieldMapping("IsActive")]
public bool IsActive
{
get
{
return _IsActive;
}
set
{
_IsActive = value;
}
}
#region One-To-Many Mappings
public BookCollection Books { get; set; }
#endregion
#region Derived Properties
public string FullName { get { return this.FirstName + " " + this.LastName; } }
#endregion
#endregion
public override bool Validate()
{
bool baseValid = base.Validate();
bool localValid = Books.Validate();
return baseValid && localValid;
}
}
<强> BookCollection.cs 强>
/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
/// <summary>
/// Initializes a new instance of the BookCollection class.
/// </summary>
public BookCollection()
{
}
/// <summary>
/// Initializes a new instance of the BookCollection class.
/// </summary>
public BookCollection (IList<Book> initialList)
: base(initialList)
{
}
}
答案 2 :(得分:0)
Custom Attributes可能符合您的需求。