Model view controller 体系结构和Microsoft.AspNet.Providers

Model view controller 体系结构和Microsoft.AspNet.Providers,model-view-controller,architecture,dependency-injection,inversion-of-control,membership-provider,Model View Controller,Architecture,Dependency Injection,Inversion Of Control,Membership Provider,我在谷歌上搜索了几个小时,找不到一篇与我需要的内容完全相关的文章 我有一个具有以下层的MVC4站点: 表示层(MVC4) 业务层 数据层 我想使用以下提供程序:(使用NuGet安装) 安装软件包Microsoft.AspNet.Providers 我的问题更像是一个建筑问题 在我看来,我应该在我的数据层中安装这个(Microsoft.AspNet.Providers),因为它是与成员数据库对话的代码 然而,我能找到的所有帖子,即使是Hanselman写的,也只是将其安装在表示层/MVC4中

我在谷歌上搜索了几个小时,找不到一篇与我需要的内容完全相关的文章

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

  • 表示层(MVC4)
  • 业务层
  • 数据层
我想使用以下提供程序:(使用NuGet安装) 安装软件包Microsoft.AspNet.Providers

我的问题更像是一个建筑问题

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

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

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

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

有什么想法吗

谢谢 罗斯


PS.希望了解使用nuget在数据/存储库层中安装此软件的过程。对DLLs Nuget正在安装的东西有点困惑。如果我在数据层中安装,nuget不会更新MVC web.config。

答案其实很简单:您应该将提供者隐藏在您在业务层中定义的抽象后面。通过这种方式,您可以编写一个适配器来实现这个抽象,并包装提供者,您可以使用依赖项注入将这个适配器注入您的业务层。这样,您只需引用MVC4项目中的Microsoft.AspNet.Providers,并防止任何代码直接引用AspNet.Providers,这样以后您就可以更轻松地切换

例如:

//在业务层中定义
公共接口IAuthorizationService
{
bool bool IsCurrentUserInRole(字符串角色);
}
公共类SomeBusinessLayerCommand
{
私有IAuthorizationService授权人;
公共业务层命令(
IAuthorizationService授权人)
{
this.authorizer=授权人;
}
公共操作()
{
if(this.authorizer.UserIsInRole(“管理员”))
{
//某个秘密管理员斯图夫
}
其他的
{
//一些普通用户stuf
}
}
}
在表示层中,您可以定义适配器:

公共类成员身份适配器:IAuthorizationService
{
公共bool IsCurrentUserInRole(字符串角色)
{
返回角色。IsUserInRole(角色);
}
}

您可以使用您最喜欢的DI容器将
iaAuthorizationService
映射到
MembershipAdapter

答案其实很简单:您应该将提供者隐藏在您在业务层中定义的抽象后面。通过这种方式,您可以编写一个适配器来实现这个抽象,并包装提供者,您可以使用依赖项注入将这个适配器注入您的业务层。这样,您只需引用MVC4项目中的Microsoft.AspNet.Providers,并防止任何代码直接引用AspNet.Providers,这样以后您就可以更轻松地切换

例如:

//在业务层中定义
公共接口IAuthorizationService
{
bool bool IsCurrentUserInRole(字符串角色);
}
公共类SomeBusinessLayerCommand
{
私有IAuthorizationService授权人;
公共业务层命令(
IAuthorizationService授权人)
{
this.authorizer=授权人;
}
公共操作()
{
if(this.authorizer.UserIsInRole(“管理员”))
{
//某个秘密管理员斯图夫
}
其他的
{
//一些普通用户stuf
}
}
}
在表示层中,您可以定义适配器:

公共类成员身份适配器:IAuthorizationService
{
公共bool IsCurrentUserInRole(字符串角色)
{
返回角色。IsUserInRole(角色);
}
}

您可以使用您最喜欢的DI容器将
iaAuthorizationService
映射到
MembershipAdapter

什么是“MVC层?”MVC中的M代表模型;它是您的数据层。我认为您的成员代码应该位于存储库对象中。@RobertHarvey,模型不是“数据层”,而是“业务逻辑层”。魔鬼在细节中=P@tereško:如你所愿,但我没有将我的业务逻辑放在模型中。它要么放在存储库中,要么放在自己的层中。从技术上讲,我想这就是模型的一部分。@罗伯塔维:对。我想说,模型是控制器用来获取视图所需信息的一切。@RobertHarvey,你所谓的“模型”实际上是域对象。在MVC中有两个主要层:表示层和模型层。表示层包含视图、控制器、模板和其他用于UI逻辑的内容。模型层包含域对象、服务、存储库等。什么是“MVC层?”MVC中的M代表模型;它是您的数据层。我认为您的成员代码应该位于存储库对象中。@RobertHarvey,模型不是“数据层”,而是“业务逻辑层”。魔鬼在细节中=P@tereško:如你所愿,但我没有将我的业务逻辑放在模型中。它要么放在存储库中,要么放在自己的层中。从技术上讲,我想这就是模型的一部分。@罗伯塔维:对。我想说,模型是控制器用来获取视图所需信息的一切。@RobertHarvey,你所谓的“模型”实际上是域对象。在MVC中有两个主要层:表示层和模型层。表示层包含视图、控制器、模板和其他用于UI逻辑的内容。模型层包含域对象、服务、存储库等。谢谢@Steven,非常感谢。等我喜欢的时候再试试。谢谢@