0

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

  • データアクセス
  • ビジネスの論理
  • 事業体
  • プレゼンテーション

ビジネス ロジックはデータ アクセス層を呼び出し、プレゼンテーション層はビジネス ロジック層を呼び出し、ビジネス エンティティはそれらすべてによって参照されます。

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

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

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

これを行うための標準的なパターンがいくつかあると確信しています。助言がありますか?

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

4

3 に答える 3

2

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

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

編集:追加情報

これは、Unit of Work の基本的なクラス構造へのリンクです...実際には世界で最もエキサイティングなものではありません。Fowler は彼の著書で詳細を説明しており、その一部をここで見ることができます。可能な実装として NHibernate の Session オブジェクトを調べることもできます ( ISessionインターフェイスを追跡することができました...実装がどこにあるのかわかりません)。

お役に立てれば。

于 2008-10-01T02:17:28.703 に答える
1

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

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 対多の関係を提供します。

于 2008-10-01T02:16:39.737 に答える
0

どの言語を使用していますか? あなたが説明したことは、Entity Frameworkが.Netで行うこととまったく同じです。しかし、使用している言語を共有していませんでした。データレイヤーを書き直したくないと思います。

于 2008-10-01T01:59:22.430 に答える