22

(ASP.NET MVCは)私は現在開発しています、私たちは、代わりに次のようなアーキテクチャを持っています。これはどのようなタイプのアーキテクチャと呼ばれていますか? Webアプリケーションの

  • Data Access Layer:データモデル:任意のデシベル
  • Domainにデータを永続化するためのロジック
  • Service Layer:ビジネスロジック(例えば、注文処理、アカウント管理、など)
  • Controllerは:サービスを消費し、/ビューへ/からのデータを受信提供
  • View:ユーザー本質的には

のユーザーインターフェイスは、私がModelを取り、DALService LayerDomainにそれを分割しました。私はModel内のすべてのロジックを詰め込むと、自分のコードが過度に複雑になったと感じました。さらに、コントローラをあまり働かせなくても、ビジネスロジックをきれいに表現できるようになりました。

私の質問は次にあります:このタイプのアーキテクチャとは何ですか?

第2の質問:このタイプのアーキテクチャは意味がありますか?そうでない場合、私は何か間違っているのですか?

答えて

23

ドメイン&のサービス層がどのくらい薄く/厚いかによって、DDDについての正しい方向に進んでいます。 DDDは知識(すなわちビジネスロジック)をドメインモデルに組み込むべきだと述べています。データアクセスの問題をDALに移すことはDDDと一致していますが、ビジネスロジックをサービスレイヤに移動することはできません。薄いドメインの "データモデル"レイヤー(主にエンティティ用)と太いサービスレイヤー(主に "ビジネスロジック"用)がある場合、anemic domainがあります。

また、DDDには技術的に「サービスレイヤー」はありません。 「アプリケーションレイヤー」が存在する可能性がありますが、それは薄く、アプリケーションフロー/ドメインクラスのライフタイムの管理のみに責任があります。これは本質的に、.NET MVCでControllersを実行し、Web httpのコンテキストでアプリケーションフローを管理します。

モデル内のすべてのロジックを詰め込んでコードが複雑すぎる場合は、「過度に複雑」という意味の例を聞くことに興味があります。複雑なドメインを正しくモデリングすることができます。複雑なドメインをモデリングすることもできますし、DDDパターンを使用して複雑な問題を解決する可能性もあります。私はあなたの質問に列挙した通り、アーチはDDDではないと言います。私はそれを「レイヤードアーキテクチャ」と呼んでいますが、それは物理的なアーチについて話すときだけ用語「層」を使用する方が好きだからです。ただし、論理アーキテクチャーは階層化されています。

私はダーリンがオニオンのアーチにリンクしているのが本当に好きです。私はそれの大ファンになりつつあり、DDDだけではないことがわかります。あなたのコードが依存関係インジェクションを使用して実行時実装とのインタフェース依存関係を解決する場合、あなたはオニオンアーチのフォームを持つかもしれません。たとえば、DALにインターフェイスを定義していますか?これらのインタフェースの実装は実行時に解決されますか?

私は新しいプロジェクトで使用し始めているアーチの例です。

  • APIプロジェクト/組立::他のすべての層で使用される一般的なインタフェース、列挙型、クラス、および拡張メソッドはタマネギ+ DDDの組み合わせです。ドメインから分離する必要はありませんが、必要に応じて行うことができます。

  • Domainプロジェクト/アセンブリ:すべてのエンティティとビジネスロジック。 APIにのみ依存します。ファクトリ、サービス、仕様、リポジトリなどのDDDパターンを使用します。また、APIで定義されていないドメイン固有のインタフェースが多く含まれています。

  • Implプロジェクト/アセンブリ:APIDomainで定義されたインタフェースの実装。これは、EF DbContextが実装されている場所、ロギング、電子メール送信などです。これらの実装はすべて依存関係注入型であるため、技術的には複数のImplプロジェクト/アセンブリを持つことができます。

  • UIプロジェクト/アセンブリ:これはMVCプロジェクトです。コントローラはドメインサーフェスを直接消費し、アプリケーションまたはサービスレイヤーを経由しません。 MVC IoC(コンストラクタインジェクション)を使用して、コントローラによって、ファクトリ、サービス、リポジトリなどのインタフェース依存関係がドメインに注入されます。

私は非常にコアにAPIレイヤーを配置しましたが、APIとドメインプロジェクトを1つにまとめることができました。いずれにしても、タマネギの大きな肉部分はドメインであり、内部に層があります。たとえば、サービスは、エンティティに依存するリポジトリに依存するファクトリに依存することがあります。

Implプロジェクトは、パレルモの図の「インフラストラクチャ」タマネギスキンとして表示されます。これはUIとともに外縁にあり、ドメイン固有の知識は含まれていません。 EFなどを使用して電子メールを送信、格納/取得する方法を知っています。必要に応じて、1つ以上のデータアクセスが可能です。たとえば、データアクセスのためのImpl、メールの処理のためのImplなどです。

MVCにはコントローラとビューがあり、UIとWebアプリケーションのフローに集中しています。ドメイン固有の知識を必要とするものはすべてドメインに委譲され、ドメインクラスはコンストラクタがコントローラに注入されます。つまり、ドメインクラス内のコンストラクタインジェクションされたインターフェイスは、IoCコンテナによって自動的に解決されます。

最後に、APIクラスとドメインクラスで定義されたインターフェイスに対してプログラミングを行うと、ドメインプロジェクトをMVCプロジェクトとは別に単体テストできます。

+0

DDDベースのASP.NET MVCプロジェクトの良い例はありますか?または、あなたが記述するアーキテクチャを利用するもの?私は何のプラクティスが使用されているかを集めることができるように、多くのASP.NET MVCプロジェクトからコードを読み込もうとしてきましたが、それは非常に難しいです。 –

+0

私はあなたのコメントへの返信を投稿する前にこれについてあなたとチャットしたいと思います:http://chat.stackoverflow.com/rooms/9000/danludwig-private-room – danludwig

+0

とても面白い答え!私はどのようにGoogleがこの古い投稿に私を指示したのか分からないが、それは本当に良いです。コードプロジェクトでDDDとオニオンアーキテクチャについての記事を例として書くことができますか?すでにD: – Celdor

4

あなたはそれを見ている角度によって異なる名前が存在する可能性があります。 MVCだから、あなたのMは複数の層に分割されているだけです。 Multitier architecture(またはN層アーキテクチャ)とも呼ばれます。 Jeffrey PalermoはまたOnion architectureという概念を使用しました。

4

DALをドメインモデルから分離し、サービスレイヤーを持っているので、ここではDDD(ドメイン駆動型設計)に向いているように見えます。そのようなan approachについての議論は有益かもしれません。

+0

+1ちょうど私が考えていたもの。 MVCアプリケーションで使用されるDDD。モデルがどれほど薄いか(またはサービスの厚さにもよる)によって異なります。 – jgauffin

20

高レベルから、私はそれを階層化されたアーキテクチャとして説明します。ドメインドリブンデザインとして記述すると、集約、リポジトリ、境界のあるコンテキストなどのような小さなパターンも見えます。私はあなたの説明からは分かりません。

ドメイン層は、それがOnion Architecture principlesのコアを有し、他のいずれかを参照していない組立/パッケージにされて存在する場合:

  • アプリケーションは、独立オブジェクトを中心に構築されていますモデル
  • インナーレイヤーはインターフェイスを定義します。ドメインあなたのDATAACCESSを参照している場合、外側の層は、探すために、具体的なことをしているカップリングの
  • 方向はすべてのアプリケーションのコアコードをコンパイルすることができ、中心
  • に向かっているインターフェイスを実装し、インフラ

から独立して実行します。

関連する問題