データベースからの出力(テーブル/ビュー/プロシージャ/関数)によって生成されたクラスを含むデータレイヤーがあります。データベース内のテーブルは正規化されており、OOP 設計と同様に設計されています (「請求書」のテーブルは「ドキュメント」のテーブルと 1:1 の関係を持ち、「請求書項目」のテーブルは「ドキュメント項目のテーブルと 1:1 の関係を持ちます」 ", etc...". データベースへの/からのすべてのアクセスは、ストアド プロシージャによって行われます (単純なテーブルの場合も同様です)。
典型的なクラスは(すぐに)次のようになります。
public class DocumentItem {
public Guid? ItemID { get; set; }
public Guid? IDDocument { get; set; }
public DateTime? LastChange { get; set; }
}
public class InvoiceItem : DocumentItem {
public Guid? IDProduct { get; set; }
public decimal? Price { get; set; }
}
問題は、データベース テーブルが OOP の多重継承に似た関係を持っていることです。ここで、すべてのデータベース出力に対して新しいクラスを実行します。ただし、すべてのデータベース出力は、データベース内の「純粋な」テーブルの組み合わせです。
理想的な解決策は、(IMHO)クラスをインターフェイスに変換し、インターフェイスの複数の実装を使用してから、メンバーを自動的に実装することです(この「テーブルクラス」にはプロパティのみがあり、プロパティの本体は常に同じです)。
例: public interface IItem { Guid? アイテムID {取得; 設定; } 日付時刻?LastChange {取得; 設定; } }
public interface IDocumentItem : IItem {
Guid? IDDocument { get; set; }
}
public interface IItemWithProduct : IItem {
Guid? IDProduct { get; set; }
}
public interface IItemWithRank : IItem {
string Rank { get; set; }
}
public interface IItemWithPrice : IItem {
decimal? Price { get; set; }
}
// example of "final" item interface
public interface IStorageItem : IDocumentItem, IItemWithProduct, IItemWithRank { }
// example of "final" item interface
public interface IInvoiceItem : IDocumentItem, IItemWithProduct, IItemWithPrice { }
// the result should be a object of class which implements "IInvoiceItem"
object myInvoiceItem = SomeMagicClass.CreateClassFromInterface( typeof( IInvoiceItem ) );
データベースには多数のテーブルが含まれており、ソリューション全体は動的にロードされるモジュール (100 以上のモジュール) で構成されています。
どのように対処するのが最善の方法だと思いますか?
編集:
"IDocumentItem" と "IItemWithPrice" (たとえば) は異なるアセンブリにあるため、部分クラスを使用することは良いヒントです。
ここで、「DocumentItem」テーブルに変更を加える場合は、すべての依存アセンブリでソース コードを再生成する必要があります。再利用はほとんどありません(多重継承が使えないため)。多数の依存アセンブリがある場合、かなり時間がかかります。