この質問をする理由は、これらのさまざまな概念をすべてつなぎ合わせる方法を考えていたからです。DDD、依存性注入、CQRS、SOA、MVC などに関する多くの例と議論がありますが、それらすべてを柔軟な方法でまとめる方法についての例はそれほど多くありません。
私の目標:
- ほとんど、またはまったく変更を加えなくても自立できるモジュールを開発する
- UI の変更または作り直しは、できるだけ簡単であるべきです (つまり、UI はできる限り少なく、「ばかげた」ものであるべきです)。
- 文書化されたパターンと原則を使用する
具体的な質問をしやすくするために、メイン アーキテクチャは次のようになります。
この例は、従業員にメモを追加する方法を示しています。従業員管理は 1 つの限定されたコンテキストです。Employee にはいくつかのプロパティがありICollection<Note>
ます。
バインドされたコンテキストは、私の理解では、コードを分離するロジックの場所です。各 BC はモジュールです。ほとんどの場合、必要に応じてそれぞれが独自の UI を保証できることがわかります (つまり、一部のモジュールは Windows phone で利用できるようになる可能性があります)。
ドメインはすべてのビジネス ロジックを保持します。
インフラストラクチャには、リポジトリの実装と、メールを送信するサービス、ドメインに属さないファイルとユーティリティを保存するサービスが含まれています。複数のドメインで使用する必要のある一般的なサービス機能 (電子メールの送信など) を、複数の BC で同じことを実装するコードを保存するために参照できる一種の API として作成することを考えています。
クエリ レイヤーは、オブジェクトを取得するためにリポジトリで必要な GetById を除くすべてのクエリを保持します。クエリ レイヤーは他の永続化インスタンスをクエリできますが、おそらく UI ごとにいくつか変更する必要があります。
Wcf または Web Api は、私のアプリケーション レイヤーのようなものです。外部ではなく、インフラストラクチャに属している可能性があります。このサービスは依存関係もセットアップするため、UI が行う必要があるのは、情報を求めてコマンドを送信することだけです。
プロセスは青い矢印から始まります。ほとんどの情報が含まれているため、モデルを読み取ります。
ステップ 1 では、この例の EmployeeDto は、メモを作成する必要がある従業員に関するユーザー情報を表示するための従業員プロパティの一部です (新しい経験に関するメモなど)。
したがって、質問は次のとおりです。
- このようなレイヤード アーキテクチャの実装には、本当に多くのマッピングが必要ですか?
- このようなメインロジックを実行するためにWcfサービスを使用することをお勧めします(またはスマートです)(実際には私のアプリケーションサービスです)
- UI レイヤーにドメイン オブジェクトを持たない Wcf の代替手段はありますか?
この実装に問題はありますか。注意すべき秋のピットはありますか?
これらすべての概念がどのように連携するかを理解するのに役立つ、推奨する良い例はありますか.
更新: 有料の本 (もう少し時間が必要です) を除いて、ほとんどの記事を読みました (かなりの量を読みました)。それらはすべて非常に優れた指針であり、より多くの Wcf をアダプターとして考える方法は、質問 2 に対する良い答えのようです。JGauffins が彼のフレームワークに取り組んでいることも、私がそのルートに行くことを計画している場合、非常に興味深いものです。 .
ただし、以下のコメントのいくつかで述べたように、いくつかの例は、イベントおよび/またはコマンド ソーシング、メッセージ バスなどを推奨または実装する傾向があると感じています。私にとって、そのレベルのスケーリングを今すぐ計画するのはやり過ぎです。多くのビジネス アプリケーションと同様に、これは "大" (内部アプリケーションに関しては、最大で数千と考えてください) の数のユーザーであり、イベントやコマンドを実装する必要があるという意味で高度に協調的なドメインではありません。それに対処するために、多くの場合、CQRS に関連付けられているキュー。
以下の回答に基づいて、私が始めるアプローチは、上記のモデルと次のような回答に基づいています。
マッピングに対処するだけです。長所は短所を上回ります。
アプリケーション サービスをインフラストラクチャに戻し、Wcf を「アダプター」と見なします。
コマンド オブジェクトを使用して、アプリケーション サービスに送信します。ドメイン オブジェクトでドメインを汚染しない。
複雑さを抑えるために、今のところ、イベント/コマンド ソース、メッセージ バスなどを使わずに管理しようとしています。
さらに、Udi Dahan による CQRS に関するこのブログ投稿にリンクしたかっただけです。本当に必要でない限り、このようなものは複雑さを抑えていると思います。