Oop 设计业务对象以指示约束,如最大长度
在设计业务对象时,是否有一个标准约定,为消费者提供一种发现约束(如属性的最大长度)的方法 它可以在UI层中使用,例如,根据业务对象中的最大长度限制设置Textbox的MaxLength属性Oop 设计业务对象以指示约束,如最大长度,oop,validation,business-objects,Oop,Validation,Business Objects,在设计业务对象时,是否有一个标准约定,为消费者提供一种发现约束(如属性的最大长度)的方法 它可以在UI层中使用,例如,根据业务对象中的最大长度限制设置Textbox的MaxLength属性 是否有标准的设计方法?验证框架通常包含与UI技术集成以传达错误的部分。例如,包含与WinForms控件绑定的WinForms的ValidationProvider extender控件 不过你的愿望不同。您希望在约束变为错误之前传达约束。因为这不是一个标准要求,我不相信大多数验证框架都有现成的东西。但是,根据
是否有标准的设计方法?验证框架通常包含与UI技术集成以传达错误的部分。例如,包含与WinForms控件绑定的WinForms的ValidationProvider extender控件 不过你的愿望不同。您希望在约束变为错误之前传达约束。因为这不是一个标准要求,我不相信大多数验证框架都有现成的东西。但是,根据所选择的框架,创建此功能可能是可以实现的。例如,验证应用程序块允许您分析已在实体上注册/配置的规则。因此,有可能构建一个控件来为您执行此操作 [编辑]
您还可以在启动时和每次击键后立即验证表单。这会导致错误图标或消息立即显示,这允许用户直接查看约束是什么(使用图标时,用户可以悬停图标以查看错误消息)。这也许不如创建自己的控件好,但它更容易实现。我有自己的验证框架,可以在指定的ValidationAttribute的帮助下验证每个字段。它使用属性来自动化大多数验证 在我的应用程序中,一个示例业务对象看起来像这样 每个业务对象都将从EntityBase抽象类继承,该抽象类有一个名为“Validate()”的公共方法。当在业务对象的给定实例上调用此方法时,它将迭代其自身的所有属性,这些属性来自ValidationAttribute,可以调用ValidationAttribute的IsValid方法来验证关联proerty的值,并返回true/false和err。味精,如果有的话 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;
}
}
/// <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)
{
}
}
BookCollection.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;
}
}
/// <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)
{
}
}
//
///BookCollection类设计用于处理Book的实例列表。
///
公共类BookCollection:EntityCollectionBase
{
///
///初始化BookCollection类的新实例。
///
公共藏书()
{
}
///
///初始化BookCollection类的新实例。
///
公共图书收藏(IList初始列表)
:base(初始列表)
{
}
}
可能满足您的需要。您是否考虑了特定的UI技术?你说的是网络还是桌面。NET、Java、PHP、Ruby等?我使用的是Windows窗体(不是WPF)。它是否因用户界面的不同而变化很大?它根本不取决于用户界面。别忘了标记您最喜欢的答案;-)。恐怕这并不能真正回答他的问题,因为他喜欢在验证之前向用户显示业务规则列表。而不是如何验证。