1

私は何時間もグーグルをしていて、私が必要としているものに正確に関連している記事を見つけることができません。

次のレイヤーを持つMVC4サイトがあります。

  • プレゼンテーション層(MVC4)
  • ビジネスレイヤー
  • データ層

次のプロバイダーを使用したい:(NuGetを使用してインストール) Install-Package Microsoft.AspNet.Providers

私の質問はもっと建築的なものです。

私の考えでは、これ(Microsoft.AspNet.Providers)は、メンバーシップデータベースと通信するコードであるため、データレイヤーにインストールする必要があります。

私が見つけることができるすべての投稿は、しかし、ハンゼルマンによってさえ、それをプレゼンテーション層/MVC4にインストールするだけです。

私は関心の分離に非常に力を入れており、アプリケーション全体で依存性注入を使用しています。

明らかに、web.configにプロバイダーの構成が必要ですが、データレイヤーにすべてのメンバーシップコードが必要です。

何かご意見は?

ありがとうRuSs

PS。nugetを使用してこれをデータ/リポジトリレイヤーにインストールするプロセスを知りたいです。NugetがインストールしているDLLについて少し混乱しています。データレイヤーにインストールした場合、nugetはMVCweb.configを更新しません。

4

1 に答える 1

1

答えは実際には非常に単純です。ビジネスレイヤーで定義する抽象化の背後にプロバイダーを隠す必要があります。このようにして、この抽象化を実装し、プロバイダーをラップするアダプターを作成し、依存性注入を使用してこのアダプターをビジネスレイヤーに注入できます。このようにすると、MVC4プロジェクトからMicrosoft.AspNet.Providersを参照するだけで済み、コードがAspNet.Providersを直接参照しないようにすることができます。これにより、後で簡単に切り替えることができます。

例:

// Define in business layer
public interface IAuthorizationService
{
    bool bool IsCurrentUserInRole(string role);
}

public class SomeBusinessLayerCommand
{
    private IAuthorizationService authorizer;

     public SomeBusinessLayerCommand(
         IAuthorizationService authorizer)
     {
         this.authorizer = authorizer;
     }

     public void SomeOperation()
     {
         if (this.authorizer.UserIsInRole("Admins"))
         {
             // some secret admin stuf
         }
         else
         {
             // some normal user stuf
         }
     }
}

また、プレゼンテーション層でアダプタを定義できます。

public class MembershipAdapter : IAuthorizationService
{
    public bool IsCurrentUserInRole(string role)
    {
        return Roles.IsUserInRole(role);
    }
}

また、お気に入りのDIコンテナIAuthorizationServiceを使用してマップすることができます。MembershipAdapter

于 2012-08-08T06:51:52.540 に答える