0

私は現在MVC4プロジェクトに取り組んでおり、Ninjectを使用してUnitOfWorkをコントローラーに注入し、UnitOfWork +GenericRepositoryパターンを使用しています。

VS2012 MVC4テンプレートは、データベースアクセス(dbの初期化など)を直接使用するため、好きではありません。

私のプロジェクトは次のように分かれています。

  • フォーム認証を使用したUIプロジェクト(mvc4アプリケーション)

  • ドメインプロジェクト(dbエンティティ、リポジトリ、UnitOfWorkインターフェイスに加えて2つのUnifOfWork実装(1つはMOQ、もう1つはEF)。これらはNinjectを介してUIコントローラーに注入されます)。

私はこの例を見ました:

http://kevin-junghans.blogspot.it/2013/03/decouple-simplemembership-from-your.html

この質問に関連する

SimpleMembership-誰かがそれをn層フレンドリーにしましたか?

そして今、私はいくつかの質問があります:

  • ここにUoWを注入するにはどうすればよいですか?WebSecurityクラスは静的であり、コンストラクターはありません。UoWを直接インスタンス化して、dbでアクティビティを実行します...

  • DBに直接アクセスするには、常にWebMatrixを初期化する必要がありますか?このコード:

        public static void Register()
    {
        Database.SetInitializer<SecurityContext>(new InitSecurityDb());
        SecurityContext context = new SecurityContext();
        context.Database.Initialize(true);
        if (!WebMatrix.WebData.WebSecurity.Initialized)
            WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection",
                "UserProfile", "UserId", "UserName", autoCreateTables: true);
    }
    

ドメインとのデカップリングを壊します..たとえば、UnitOfWorkを使用してWebSecurityを作成するにはどうすればよいですか?ベストプラクティスは何ですか?

  • ユーザープロファイルにアクセスするたびにデータベースクエリを実行せずに、追加のデータ(EmailAddressなど)を保存して取得するにはどうすればよいですか?古いCustomPrincipalのようなもの...ASP.NETMVCのカスタムプリンシパル

ありがとうございました!

4

1 に答える 1

2

ここマルコにはたくさんの質問があります。それらを突き刺してみましょう。

UOWを注入する方法

このQAで指摘されているように、静的クラスと依存性注入はうまく混ざりません。SimpleMembershipをデカップリングするこの演習を最初に行ったときは、参照した記事で説明されているように、ドメインからデカップリングすることに集中していました。これは単なる最初のステップであり、依存性注入を容易にするなど、改善することができます。WebSecurityを静的にするかどうかを議論し、静的を使用しました。これは、元のSimpleMembershipが実装され、SimpleSecurityのユーザーにとってよりシームレスな移行になるためです。。SimpleSecurityはオープンソースプロジェクトであり、貢献を歓迎します。非静的にすることは難しくなく、おそらく長期的には理にかなっています。非静的にすると、ファクトリパターンを使用してUnitOfWorkを作成し、適切なファクトリを注入できます。

WebSecurityを登録する必要があるのはなぜですか?

SimpleSecurityは、初期化が必要なWebMatrixWebSecurityクラスの単なるラッパーです。Registerメソッドは、WebMatrixが初期化されていることを確認し、データベースを初期化します。Globa.asaxでこのメソッドを呼び出すと、ドメインと何らかの形で結合されることに同意しません。UnitOfWorkで動作させることは、アプリケーションドメインとは関係がなく、アプリケーションの起動時にRegisterメソッドを呼び出す必要もありません。

毎回データベースクエリを実行せずに、追加のデータ(例:電子メール)を保存して取得するにはどうすればよいですか?

これは、ClaimsPrincipalを使用することにより、.NET4.5で実際に非常に簡単に実行されます。.NET 4.5のすべてのプリンシパルは、ClaimsPrincipalを継承します。これにより、情報をクレームとしてプリンシパルに格納できます。クレームは基本的に、ユーザーに関するあらゆるタイプのデータを保存できるキーと値のペアです。たとえば、ASP.NETでは、ユーザーの役割はクレームとして保存されます。独自のクレームを追加するには、クレーム変換と呼ばれる処理を実行する必要があります。次に、情報を取得するために、カスタムクレームプリンシパルを作成できます。これをSimpleSecurityに追加すると便利な機能になります。

于 2013-03-27T15:09:23.587 に答える