1

我已经在谷歌上搜索了几个小时,但找不到与我需要的完全相关的文章。

我有一个包含以下层的 MVC4 站点:

  • 表示层 (MVC4)
  • 业务层
  • 数据层

我想使用以下提供程序:(使用 NuGet 安装) 安装包 Microsoft.AspNet.Providers

我的问题更多的是建筑问题。

在我看来,我应该在我的数据层中安装它(Microsoft.AspNet.Providers),因为它是与会员数据库对话的代码。

然而,我能找到的所有帖子,即使是 Hanselman 也只是将它安装在表示层/MVC4 中。

我非常重视关注点分离,并在整个应用程序中使用依赖注入。

显然,我需要 web.config 中提供程序的配置,但需要数据层中的所有成员资格代码。

有什么想法吗?

谢谢RuSs

PS。很想知道使用 nuget 在数据/存储库层中安装它的过程。对于 Nuget 正在安装的 DLL 有点困惑。如果我安装在我的数据层中,nuget 不会更新 MVC web.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);
    }
}

您可以映射IAuthorizationServiceMembershipAdapter使用您最喜欢的 DI 容器。

于 2012-08-08T06:51:52.540 回答