web-dev-qa-db-ja.com

階層化アプリケーションの実装を可能にするASP.NET MVC 5 IDの分離

私はASP.NET MVCを初めて使用し、個人ユーザー認証を使用するMVC 5アプリケーションを開発しています。 Modelレイヤー、DALレイヤー、Reposなどのアプリケーションを分離するときにレイヤードパターンを実行してきましたが、今はMVC 5で、ユーザーとロールの管理と認証を使用できるようにしたいと考えています。 、そしてそれでも私のアプリケーションにその階層化構造が残っています。今のところ、IdentityはMVCプロジェクト自体と、そこにユーザーモデルとロールモデルがあり、コンテキストも含まれているようです。

私のアプリケーションで今やったことは、DAL、UnitOfWork、Repos、その他のモデルなど、分離するはずのすべてのレイヤーをMVCプロジェクトに(別々のフォルダーに)持っていることです。今。そして、それが正しい方法ではないことを知っています。

それで、誰かがこれについてのいくつかの良い例や記事を私に指摘したり、それが可能かどうか、そしてどのようにして可能かを直接説明できますか?グーグルはこれについて私に友好的ではありませんでした。ありがとう!

43
Bairose

これが私が試してみたいことの簡単なドラフトです...私はこれらのレイヤーを作成します:

  • Contoso.Core(クラスライブラリ)
  • Contoso.Data(クラスライブラリ)
  • Contoso.Service(クラスライブラリ)
  • Contoso.Web.Framework(クラスライブラリ)
  • Contoso.Web(ASP.NET MVC 5.0)

Contoso.Core:

このレイヤーは、データベースのTABLESを表すすべてのエンティティ/クラスを保持します。

したがって、たとえば、私は次のようになります:

  • User.csクラス。
  • Product.csクラス
  • ProductDetail.csクラス
  • 等..

これらのエンティティ/クラスをドメインオブジェクトと呼ぶ人もいれば、POCOクラスと呼ぶ人もいます。

または、これらのエンティティ/クラスは他のレイヤー間で使用される場合とされない場合があるため、コアレイヤーで定義されます。


Contoso.Data:

このレイヤーは、ContosoDbContext.csクラスを定義する場所です。 DbSet<>をすべて定義したのは、そのファイル内です。したがって、たとえば、ContosoDbContext.cs内に次のように記述します。

  • public DbSet User {get;セットする; }
  • public DbSet Product {get;セットする; }
  • public DbSet ProductDetail {get;セットする; }

言うまでもなく、Contoso.DataレイヤーはContoso.Coreレイヤーに依存関係があります。さらに、ジェネリックリポジトリと「データアクセス」に関連するものをすべて持つのは、そのContoso.Dataレイヤー内です。


Contoso.Service:

このレイヤーは、すべてのビジネスルールを配置する場所です。たとえば、Login()メソッドを持つUserService.csクラスがあるとします。 Login()メソッドはユーザー名/パスワードを受け取り、リポジトリを呼び出してユーザーを検索します。

サービスレイヤーにはリポジトリが必要なので、Contoso.Dataレイヤーに依存関係があります。また、ユーザークラス(Contoso.Coreレイヤー内にたまたま存在する)で遊んでいるため、Contoso.Coreレイヤーにも依存関係があります。 。


Contoso.Web.Framework:

このレイヤーは、Contoso.CoreContoso.DataContoso.Serviceに依存します。このContoso.Web.Frameworkレイヤーを使用して、依存性注入を構成します。


Contoso.Web:

最後のレイヤーであるMVC 5.0アプリケーションは、Contoso.Web.FrameworkおよびContoso.ServiceレイヤーのContoso.Core ANDに依存します。

コントローラーは、Contoso.Serviceレイヤーで定義されたクラス内に存在するメソッド(たとえば、Login()メソッド)を呼び出します。

Login()メソッドは、たとえば、ユーザークラス(nullまたはデータが設定されている)を返す場合と返さない場合があります。また、ユーザークラスを返すため、コントローラーの内部にいるため、Contoso.Webレイヤーには、Contoso.ServiceおよびContoso.Coreへの依存関係が必要です。


もちろん、ここではすべて、またはすべてのレイヤーについて詳しく説明していませんが、これは、使用するアーキテクチャのタイプの例を示すためのものです。

これまでのところ、質問には答えていませんが、MVC 5.0とその新しいIdentityメカニズムについてはほとんど知りませんが、Contoso.Coreレイヤーには、Microsoft.AspNet.Identity.EntityFrameworkに加えてMicrosoft.AspNet.Identity.Coreへの依存関係が必要になると思います。

同様に、私のContosoDbContext.csクラスは、Microsoft.AspNet.Identity.EntityFramework.dllに属しているIdentityDbContextインターフェイスを実装する必要があります。

これは、私のContoso.DataレイヤーがMicrosoft.AspNet.Identity.EntityFrameworkに依存し、おそらくMicrosoft.AspNet.Identity.Coreにも依存していることを意味します...

あなたが言うように、新しいMVC 5.0プロジェクトを作成すると、これらすべてが存在し、単一のアプリケーション内で定義されます。何もレイヤーに分離されていません。したがって、上記のアーキテクチャでは、ContosoDbcontext.csクラスはContoso.Dataレイヤー内にあり、ASP.NET MVCアプリケーション内には直接ありません。

私は新しいASP.NET Identityを試したことも、物事を切り離そうとしたこともないので、質問に正直に答える方法がわかりません。私はあなたが物事を動かして動かさなければならないだろうと思います。

もしそうなら、いつそれが起こったのか、そしてあなたが遭遇した事柄/問題は何かを私たちに教えてください。

その間、私はこれがあなたにいくつかの光を当てるのに役立つことを願っています(またはそうではありません)。

ビンス

33
Vlince