【发布时间】:2009-05-28 20:06:06
【问题描述】:
ASP.NET MVC 1.0 项目模板包含一个AccountController 类,它支持构造函数注入:
public AccountController(IFormsAuthentication formsAuth,
IMembershipService service)
{
FormsAuth = formsAuth ?? new FormsAuthenticationService();
MembershipService = service ?? new AccountMembershipService();
}
还包括一个AccountMembershipService 类,它也支持构造函数注入:
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
我相信你们中的许多人已经将这些用于单元测试,但我的目标是使用 Windsor 注入 SqlMembershipProvider,从而在运行时使用 Windsor XML 文件而不是 web.config 对其进行配置。换句话说,我想对AccountMembershipService 类使用构造函数注入,并且我想继续使用内置的 ASP.NET 2.0 会员系统。我只是想让会员系统的配置通过 Windsor IoC。
如果不编写我自己的 MembershipProvider 这是否可能,或者SqlMembershipProvider 不能很好地与 IoC 配合使用?
From MSDN:“SqlMembershipProvider 构造函数由 ASP.NET 调用,以创建应用程序配置中指定的 SqlMembershipProvider 类的实例。此构造函数不打算在您的代码中使用 em>。”
我相信Phil asked a very similar question,这是他收到的the answers。
感谢您的帮助。
更新: 需要明确的是,我通过 DI 提供应用程序的 MembershipProvider 的原因是为了支持多个租户。每个租户都有一个带有ASP membership tables 的独立数据库。 DI 允许我在运行时切换连接字符串,从而使核心应用程序不知道每个租户正在使用哪个数据库。 Windsor 正在控制 DI,它“知道”哪个租户通过 url 发出请求:
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
迈克·哈德洛writes about this technique。我只是想将SqlMembershipProvider 整合到他对这个 IoC 设计的使用中。
【问题讨论】:
-
一个细节可能会让这个问题变得公开:AccountMembershipService 的构造函数中的 Membership.Provider 是什么?
-
.Provider 是“使用 System.Web.Security.MembershipProvider 抽象基类公开的应用程序的默认成员资格提供程序。”
-
如果 AccountMembershipService 构造函数获取 null 提供程序,Membership.Provider 将根据 web.config 设置返回 SqlMembershipProvider(由运行时实例化)。这就是我想通过温莎取代的行为。
-
你真正的目标是什么?注入 MembershipProvider 与 Windsor 配置无关
-
@mausch 该应用需要多个租户,每个租户都有一个独立的数据库和成员表。我正在使用 Windsor 根据上下文(URL)切换组件。 SqlMembershipProvider 是我想要切换的一个:tenant1.example.com 和tenant2.example.com 将具有不同的 css、connectionString、provider 等——在 Windsor 配置中指定。 Mike Hadlow 解释了mikehadlow.blogspot.com/2008/11/… 的技术,但我在切换 SqlMembershipProvider 时遇到了麻烦,因为“此构造函数不打算在您的代码中使用。”
标签: asp.net-mvc dependency-injection asp.net-membership castle-windsor sqlmembershipprovider