できるだけ詳しく説明するように努めます。SO で同様の質問があるかもしれません。私はそれらすべてを調べましたが、必要なものはありません。
だから、私は大規模なC# MVC5ベースの Web プロジェクトから始めて、できるだけ分離した方法ですべてを整理したいと考えています。データベース部分については、Telerik (以前は Open Access として知られていた)の Data Access ORM を使用します。これは、プロジェクトにMySQLを使用するためです。
これまでのところ、以下のようにすべてを整理しました。プロジェクトを分割するためのソリューション レベル フォルダーを定義しました。
**Solution**: td
- Business (Folder)
-- td.core (Project) (Contains Services and ViewModels)
-- td.interfaces (Project)
- Data (Folder)
-- td.data (Project) (Contains Database Models i.e. Telerik, Repository, Context Factory and Unit of Work class)
- Presentation (Folder)
-- td.ui (Project) (MVC5 Project, also Implemented IoC here)
- Shared (Folder)
-- td.common (Project)
一般に、MVC プロジェクトでモデルをバインドする場合、ソリューションにプロジェクトが 1 つしかない場合は、問題なく簡単に機能します。
つまり、MVC コントローラーで
var obj = new TempClass();
return View(obj.getAllUsers());
そして、対応するビューでこれを一番上で使用します
@model (model type here)
上記のように、これらすべてのレイヤーを独自のプロジェクトで分離すると。データ レイヤーは、データベースと直接通信するレイヤーであるため、Data ノードでTelerik Data Access rlinq スキーマを生成し、データベース内のテーブルのクラスも生成します (デフォルト構成)。
さて、上記の設定から、コントローラーからビジネスレイヤーを呼び出してデータを取得し、データノードと通信することになっています。
問題は、コントローラーとビューで、バインドしているモデルのデータ型/参照が必要になることです。では、自動生成されたクラスを引き続きデータ ノードに保持する必要がありますか?それとも、生成されたクラスのみを共有ノードに移動し、それらをコントローラー/ビューでバインディングに使用できますか? どれが良い練習になるでしょうか?コントローラーでデータノードを直接参照したくないので、上記のようにすべてを分離しても意味がありません。
別の簡単な質問です。REST/SOAP を介して非常に多くのサードパーティ API を統合します。これらはどのレイヤーに最適ですか?
他のアーキテクチャに関する提案や、ここで見逃しているものがある場合は、提案してください。
よろしくお願いします。
アップデート!!!
上記の更新されたアーキテクチャを参照してください。
これが私がこれまでにしたことです。
- リポジトリ、サービス、IoC を追加しました。
- 私の Global.asax では、サービスなどを構成する IoC を初期化しています。
- 私のコントローラーには、ビジネスレイヤーからのサービスをパラメーターとして持つオーバーロードされたコンストラクターがあります。
- コントローラはサービスを呼び出してデータを取得し、サービスはそのリポジトリを呼び出します。
- タイプごとにリポジトリを手動で作成する代わりに、一般的なリポジトリ パスに従いました。
- サード パーティの API については、データ レイヤーを使用しますが、ビジネスは後でデータがどこから来たのかわかりません。必要なものを尋ねるだけです。
- これはすべて、必要に応じてビジネス レイヤーとデータ レイヤーの両方から参照される専用のインターフェイス プロジェクトの助けを借りて容易になりました。両方とも abc インターフェースを実装したいので、循環参照があるため、ビジネス層またはデータ層で宣言することはできません。これにより、両方の (ビジネス/データ) プロジェクトを相互に参照できなくなります。
したがって、上記の変更の助けを借りて、今やりたいことを簡単に行うことができ、すべてが思い通りに完璧に機能しています。さて、私が持っている最後の質問は
このアーキテクチャに欠陥はありますか?