【问题标题】:How do I get an instance of an asp .net mvc application's MembershipProvider from a controller?如何从控制器获取 asp .net mvc 应用程序的 MembershipProvider 的实例?
【发布时间】:2010-02-27 21:21:14
【问题描述】:

我需要从控制器中获取应用程序的 MembershipProvider 实例。我有一个自定义成员实现,它有一个描述登录用户的自定义用户属性。问题的核心是我需要检索这个 User 对象。

我的应用程序已经完成了 MembershipProvider 的骨架实现,但它工作正常并且可以正确验证尝试登录或创建新帐户的用户。因此,我为 ASP .NET MVC 应用程序保留了开箱即用的 AccountController 的默认实现。

如果您需要更多详细信息,我很乐意提供。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework


    【解决方案1】:

    我猜您的 MembershipProvider 已在 web.config 中注册。如果是这样,您可以使用静态属性System.Web.Security.Membership.Provider。

    【讨论】:

    • 感谢您的回复迈克。我已经尝试过了,它会起作用,但我不喜欢这样做。我的理由是:我创建了 MembershipProvider 的自定义实现;但是,通过这种方式检索提供者并不会检索我创建的类型之一,而是检索 MembershipProvider。我可以将它转换为我的类型并且有效,但我不知道这是否令人不悦。此外,在记住用户的情况下,我的自定义实现中的 User 属性为 null 并且永远不会被填充,因此这也是我正在处理的问题。
    • 如果你指望 Initialize 被调用,你需要这样做。使用 DI,将不会调用 Initialize 方法。有关更多信息,请参阅此帖子:stackoverflow.com/a/1597023/156611
    【解决方案2】:

    如果您在 Visual Studio 中创建一个新的 ASP.NET MVC 项目,它将自动为您创建一个名为 AccountController 的控制器。此控制器提供了一个示例,说明您应该如何访问 ASP.NET MVC 中的 MembershipProvider。

    简而言之,它通过将 MembershipProvider 隐藏在 IMembershipService 接口后面来促进依赖注入 (DI) 和松散耦合。

    AccountMembershipService 类将 IMembershipService 实现为 Adapter 的 MembershipProvider。

    您可以将IMembershipService 的实例注入任何需要它的控制器,就像AccountController 所做的那样。

    【讨论】:

    • 感谢您的及时回复,马克。我请求您与我交流,因为我正在尝试一次学习很多技术并且还没有开始思考如何实际使用 DI,不过,我想我理解它的目的。我只是部分明白你在说什么。你能详细说明一下吗?
    • 安装 ASP.NET MVC SDK 时,您会在 Visual Studio 中获得新的项目模板。当您创建一个新的 ASP.NET MVC 项目时,项目模板将生成一个名为 AccountController.cs 的文件。如果您查看此文件,您将看到与 MembershipProvider 交互的示例代码。
    【解决方案3】:

    我同意 Mike 的观点,这是执行此操作的标准方法,但为了减轻每次都必须强制转换 Provider 的困惑,您可以创建一个基本控制器,您的所有控制器都从该控制器继承并具有一个受保护的属性一个 getter 施放一次。这将实现更好的代码重用,如果您更改了您的会员提供商,您只需在一次地方进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 2018-11-28
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多