あなたのデザインはメンテナンス可能でなければなりません。これが私のプロジェクトにあるものです。
1.)Application.Infrastructure
- すべてのビジネスオブジェクトの基本クラス、ビジネスオブジェクトコレクション、データアクセスクラス、および拡張メソッドとしてのカスタム属性とユーティリティ、ジェネリック検証フレームワーク。これにより、最終的な.netアプリケーションの全体的な動作構成が決まります。
2.)Application.DataModel
- データベースの型付きデータセット。
- TableAdaptersは、トランザクションやその他の必要な機能を組み込むために拡張されました。
3.)Application.DataAccess
- データアクセスクラス。
- 基になる型付きデータセットを使用してデータベースアクションが照会される実際の場所。
4.)Application.DomainObjects
- ビジネスオブジェクトとビジネスオブジェクトコレクション。
- 列挙型。
5.)Application.BusinessLayer
- プレゼンテーション層からアクセス可能なマネージャークラスを提供します。
- HttpHandlers。
- 私自身のPage基本クラス。
- もっと多くのものがここに行きます。
6.)Application.WebClientまたはApplication.WindowsClient
- 私のプレゼンテーション層
- Application.BusinessLayerおよびApplication.BusinessObjectsから参照を取得します。
Application.BusinessObjectsはアプリケーション全体で使用され、必要に応じてすべてのレイヤーを移動します[Application.DataModelとApplication.Infrastructureを除く]
私のクエリはすべて、Application.DataModelのみで定義されています。
Application.DataAccessは、データアクセス操作の一部としてBusinessオブジェクトを返すか受け取ります。ビジネスオブジェクトは、リフレクション属性を使用して作成されます。各ビジネスオブジェクトは、データベース内のターゲットテーブルへの属性マッピングでマークされ、ビジネスオブジェクト内のプロパティは、それぞれのデータベーステーブル内のターゲット列への属性マッピングでマークされます。
私の検証フレームワークでは、指定されたValidationAttributeを使用して各フィールドを検証できます。
私のフレームワークは、属性を多用して、マッピングや検証などの面倒なタスクのほとんどを自動化します。フレームワークの新機能として新機能を追加することもできます。
サンプルのビジネスオブジェクトは、私のアプリケーションでは次のようになります。
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.")]
public override int Id
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
[DataFieldMapping("UserName")]
[Searchable]
[NotNullOrEmpty(Message = "Username Is Required.")]
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)
{
}
}