質問

私が取り組んでいるプロジェクトは、n層アーキテクチャを使用しています。レイヤーは次のとおりです。

  • データアクセス
  • ビジネスロジック
  • ビジネスエンティティ
  • プレゼンテーション

ビジネスロジックはデータアクセスレイヤーを呼び出し、プレゼンテーションレイヤーはビジネスロジックレイヤーを呼び出し、すべてのエンティティがビジネスエンティティを参照します。

ビジネスエンティティは、基本的にデータモデル1-1と一致しています。すべてのテーブルには、クラスがあります。最初にフレームワークが設計されたとき、主従関係または子親関係の管理については考慮されていませんでした。したがって、すべてのビジネスロジック、データアクセス、およびビジネスエンティティは、データベース内の単一のテーブルのみを参照していました。アプリケーションの開発を開始すると、オブジェクトモデルにこれらの関係を持たないことが深刻な打撃を与えていることがすぐに明らかになりました。

すべてのレイヤー(データベースを含む)はすべて、自社開発のコードジェネレーターの駆動に使用する社内メタデータデータベースから生成されます。

問題は、エンティティの関係をロードまたは遅延ロードするための最良の方法は何かです。たとえば、住所テーブルとの親子関係を持つ個人クラスがあるとします。これは、PersonオブジェクトのAddressesのコレクションプロパティとしてビジネスエンティティに表示されます。 1対1の関係がある場合、これは単一のエンティティプロパティとして表示されます。関係オブジェクトを埋めて保存するための最良のアプローチは何ですか?私たちのビジネスエンティティはビジネスロジックレイヤーの知識がないため、プロパティが呼び出されたときに内部的に行うことはできません。

これを行うための何らかの標準パターンがあると確信しています。提案はありますか?

また、1つの注意点は、DataAcessレイヤーがリフレクションを使用してエンティティを構築することです。ストアドプロシージャは、1つのテーブルに基づいて1つの結果seltを返し、リフレクションを使用して、プロパティの名前と列の名前を一致させることにより、ビジネスオブジェクトを作成します。そのため、結合を行うのは難しいでしょう。

役に立ちましたか?

解決

Fowlerの Patterns of Enterprise Architecture の本をご覧になることを強くお勧めします。この種の問題を解決するためのいくつかの異なるアプローチがあり、エンティティの関係を含め、彼はうまく説明しています。

より魅力的な項目の1つは、基本的にコレクターである作業単位パターンです。これは、エンティティに対して実行されるアクションを監視し、アクションが完了すると、適切なデータベース呼び出しをバッチ処理し、データベースへのリクエスト。このパターンは、 NHibernate によって使用される中心概念の1つであり、IDisposableを実装するオブジェクトを使用します。 「作業」の終了を知らせます。これにより、アクションをusingでラップし、作業ユニットにアクションを処理させることができます。

編集:追加情報

これは、作業ユニットの基本クラス構造へのリンクです...本当に世界で最もエキサイティングなことではありません。ファウラーは彼の本で詳細を提供しており、その一部はこちら。また、可能な実装としてNHibernateのSessionオブジェクトを見ることができます( ISession インターフェース...実装がどこにあるかわからない)

これがお役に立てば幸いです。

他のヒント

過去に使用したアプローチは、必要なオブジェクトを取得するのに十分なコンテナタイプを作成することです。例:

public class Relation<T>
{
  private T _value;

  private void FetchData()
  {
    if( LoadData != null ) {
      LoadDataEventArgs args = new LoadDataEventArgs(typeof(T), /* magic to get correct object */);
      LoadData(this, args);
      _value = (T)args.Value;
    }
  }

  public event EventHandler<LoadDataEventArgs> LoadData;

  public T Value {
    get {
      if( _value == default(T) )
        FetchData();
      return _value; 
    }
    set { /* Do magic here. */ }
  }
}

次に、エンティティで次のように宣言します:

[RelationCriteria("ID", EqualsMyProperty="AddressID")]
public Relation<Address> Address {
  get; set;
}

そして、LoadDataイベントにハンドラーを追加するためにAddressプロパティを宣言するのは、タイプのローダー次第です。

同様のクラスがIListを実装して、1対多の関係を提供します。

どの言語を使用していますか?あなたが説明したのは、まさにEntity Frameworkが.Netで行うことです。しかし、使用している言語を共有していなかったため、データレイヤーを書き換えたくないと考えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top