私はエンティティフレームワークを使用してDALを実装しています。アプリケーションでは、3つのレイヤー(DAL、ビジネスレイヤー、プレゼンテーション)があります。これはウェブアプリです。 DALの実装を開始したとき、DALはビジネス・レイヤー上のサービスによって与えられたObjectContextをメソッドが受け取って操作するクラスをDalに持たせるべきだと考えました。この決定の背後にある論理的根拠は、異なるObjectContextが異なるDB状態を参照するため、外部キーの一致やその他の不一致の問題により一部の操作が拒否される可能性があるということです。DTO + UnitOfWorkパターンは、WebアプリケーションのDALを設計するための良いアプローチですか?
サービス・レイヤーからオブジェクト・コンテキストを生成して伝播すると、レイヤー間の結合が高くなることに気付きました。そこでAutomapperによってマッピングされたDTOを使用することにしました。(管理されていないエンティティや、高結合を主張するセルフトラッキングエンティティ、エンティティを上位レイヤに露出させる、低効率)、UnitOfWorkを使用することにしました。したがって、ここに私の質問があります:
- これは、WebアプリケーションのDALを設計する正しい方法ですか?どうして?
- 「はい」と答えた場合、どのようにUnitOfWorkパターンでDTOのコンセプトを調整するのですか?
- "いいえ"と答えた場合、これはWebアプリケーションのDALを設計する正しい方法でしょうか?
可能な場合は、回答をサポートする参考文献を記載してください。現在の設計について
:プレゼンテーション、ビジネス、DAL:
アプリケーションは三つの層の上に開発することが計画されています。ビジネスレイヤにはファサードとサービスの両方があります
サービスでのみ表示されるITransaction(変更を破棄して保存する2つの方法のみ)というインターフェイスがあります。トランザクションを管理するために、ObjectContextとITransactionを拡張するTransactionクラスがあります。ビジネスレイヤーでは、他のObjectContextメソッドにアクセスできないようにすることを念頭に置いて設計しました。
DALでは、2つの汎用タイプ(エンティティ用と関連DTO用)を使用して抽象リポジトリを作成しました。このリポジトリには、一般的な方法で実装されたCRUDメソッドと、汎用リポジトリのDTOとエンティティをAutoMapperでマップする2つの汎用メソッドがあります。抽象リポジトリコンストラクタは引数としてITransactionをとり、ITransactionをProctected ObjectContextプロパティに割り当てるために、ObjectContextを要求します。
具体的なリポジトリは、.netタイプとDTOだけを受け取り、返すべきです。
作成する一般的な方法は、添付されたエンティティの一時的なIDまたは永続的なIDを生成しません(SaveChanges()
を使用してから、必要なトランザクション性を失うまで)。これは、サービスメソッドがそれを使用してBLのDTOを関連付けることができないことを意味します)
質問の最新バージョンをご覧ください...ありがとう! – JPCF
優れたリンク...! – JPCF