5

Eric Evansのドメイン駆動設計を読んだ後、いくつか質問があります。私は検索しましたが、満足のいく答えを見つけることができた場所はありませんでした。以下の質問を明確に理解している方がいらっしゃいましたら、お知らせください。

私の懸念は

  1. リポジトリは、DB、Webサービスから既存の集計を取得するためのものです。はいの場合、CanRepositoryはこのエンティティに対してトランザクション呼び出しも行うことができます(つまり、金額の転送、アカウントの詳細の送信など)

  2. エンティティは、電子メール..ログなどを送信するためのインフラストラクチャレイヤーサービスを呼び出すビジネスロジックを持つメソッドを持つことができます(ISサービスを直接呼び出すエンティティメソッド)。

  3. リポジトリの実装とファクトリクラスはインフラストラクチャ層に存在します。その正しいステートメントですか?

  4. UIレイヤー(コントローラー)はリポジトリメソッドを直接呼び出すことができますか?または、これらをアプリケーション層から呼び出す必要がありますか?

私の心にはまだ多くの混乱があります...私を導いてください...私が使用している本EricEvanのドメイン駆動設計.......NETドメイン駆動設計とC#

4

3 に答える 3

13
  1. リポジトリを読み取り専用にするか、トランザクションを許可するかについては、多くの議論があります。DDDは、これらのビューのいずれも指示しません。あなたは両方を行うことができます。読み取り専用リポジトリの支持者は、すべてのCUD操作に作業単位を好みます。

  2. ほとんどの人(自己を含む)は、エンティティが永続的であるとは考えていません。その原則を少し拡張すると、それらは自己完結型であり、抽象的な形式であっても、すべてのインフラストラクチャ層サービスがない必要があることを示します。つまり、インフラストラクチャサービスへの呼び出しは、エンティティで動作するサービスクラスに属していると言えます。

  3. リポジトリの実装とファクトリ(存在する場合)がインフラストラクチャ層に存在する必要があるのは正しいように思われます。ただし、ドメインサービスがインフラストラクチャ層に依存せずにインターフェイスと対話できるように、それらのインターフェイスはドメイン層に存在する必要があります。

  4. DDDは、レイヤーをスキップできるかどうかを実際には指示しません。この本の後半で、エヴァンスはレイヤリングについて少し話し、これを許可するとリラックスレイヤリングと呼んでいるので、彼はそれをいくつかの選択肢の1つと見なしていると思います。個人的には、レイヤーのスキップを防止したいと思います。これにより、呼び出しがすでに正しいレイヤーを通過している場合に、将来的に何らかの動作を簡単に挿入できるようになります。

于 2009-09-25T03:35:11.073 に答える
9
  1. 個人的には、私の最新のDDDプロジェクトでは、NHibernateセッションを保持する作業ユニットを使用しています。UoWはリポジトリにctor注入され、追加、削除、および検索の単一責任をリポジトリに与えます。

  2. Evansは、DDDブックに欠けているパズルの1つは、「ドメインイベント」であると述べています。Udi DahanのDomainEventsのようなものを使用すると、完全に分離されたアーキテクチャが得られます(ドメインオブジェクトは単にイベントを発生させるだけです)。個人的には、配線にドメインイベントとStructureMapの修正バージョンを使用しています。それは私のニーズに最適です。

  3. 他の推奨事項に基づいて、リポジトリインターフェイスをモデルの一部にし、それらの実装をインフラストラクチャの一部にすることをお勧めします。

  4. はい!私は個人的に、サービスとリポジトリがプレゼンター/コントローラー(ASP.NET/ASP.NET MVC)に注入された3つのDDD Webプロジェクトに取り組んできましたが、それは私たちのコンテキストでは非常に理にかなっています。

于 2009-09-25T07:07:05.977 に答える
1
  1. リポジトリは、エンティティの検索と保存専用である必要があり、その層にビジネスロジックがあってはなりません。例えば:

    repository.TransferAmount(amount、toAccount); // これは悪いです

  2. エンティティは、ドメインで定義された抽象化に依存している限り、メールの送信などを行うことができます。実装はインフラストラクチャ層にある必要があります。

  3. はい、リポジトリの実装をインフラストラクチャ層に配置します。

  4. UIレイヤー(コントローラー)はリポジトリメソッドを直接呼び出すことができますか?または、これらをアプリケーション層から呼び出す必要がありますか?

はい、私はほとんどの部分でこのパターンに従うようにしています:

[UnitOfWork]
public ActionResult MyControllerAction(int id)
{
    var entity = repository.FindById(id);
    entity.DoSomeBusinessLogic();
    repository.Update(entity);
}
于 2009-09-26T20:30:26.240 に答える