プロパティの最大長などの制約を発見する方法を消費者に提供するためのビジネスオブジェクトを設計する際の標準的な規則はありますか?
UIレイヤーで使用して、たとえば、ビジネスオブジェクトの最大長の制限に従ってTextboxのMaxLengthプロパティを設定できます。
このための標準的な設計アプローチはありますか?
プロパティの最大長などの制約を発見する方法を消費者に提供するためのビジネスオブジェクトを設計する際の標準的な規則はありますか?
UIレイヤーで使用して、たとえば、ビジネスオブジェクトの最大長の制限に従ってTextboxのMaxLengthプロパティを設定できます。
このための標準的な設計アプローチはありますか?
検証フレームワークには、多くの場合、エラーを伝える際に UI テクノロジと統合するためのパーツが含まれています。たとえば、 Microsoft Enterprise Library Validation Application Blockには、WinForms ErrorProviderコントロールとバインドする WinForms 用の ValidationProvider 拡張コントロールが含まれています。
あなたの願いは違いますが。エラーが発生する前に、制約を伝えたいと考えています。これは標準的な要件ではないため、ほとんどの検証フレームワークがすぐに使用できるものを備えているとは思えません。ただし、選択したフレームワークによっては、これを作成できる場合があります。たとえば、検証アプリケーション ブロックを使用すると、エンティティに登録/構成したルールを分析できます。そのため、これを行うコントロールを作成することができます。
[編集] また、起動直後と各キーストローク後にフォームを検証することもできます。これにより、エラー アイコンまたはメッセージがすぐに表示され、ユーザーは制約が何であるかを直接確認できます (アイコンを使用すると、ユーザーはアイコンをホバーしてエラー メッセージを表示できます)。これは、独自のコントロールを作成するほどうまくはないかもしれませんが、実装ははるかに簡単です。
指定されたValidationAttributeを使用して各フィールドを検証できる独自の検証フレームワークがあります。属性を使用して、ほとんどの検証を自動化します。
サンプルのビジネスオブジェクトは、私のアプリケーションでは次のようになります。
各ビジネスオブジェクトは、「Validate()」と呼ばれるパブリックメソッドを持つEntityBase抽象クラスから継承します。このメソッドがビジネスオブジェクトの特定のインスタンスで呼び出されると、ValidationAttributeから派生した属性を持つ独自のすべてのプロパティを反復処理し、ValidationAttriubteのIsValidメソッドを呼び出して、関連付けられたプロパティの値を検証し、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)
{
}
}