将MembershipProvider注入ASP.NET MVC AccountController

时间:2009-05-28 20:06:06

标签: asp.net-mvc dependency-injection asp.net-membership castle-windsor sqlmembershipprovider

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 Membership系统。我只想让会员系统的配置通过Windsor IoC。

如果不编写自己的MembershipProvider,或者SqlMembershipProvider与IoC不兼容,这是否可行?

  

From MSDN:“ASP.NET调用SqlMembershipProvider构造函数来创建应用程序配置中指定的SqlMembershipProvider类的实例。此构造函数不打算在代码中使用“。

我相信Phil asked a very similar question,这是他收到的the answers

感谢您的帮助。

<小时/> 的更新: 为了清楚起见,我通过DI提供应用程序的MembershipProvider的原因是支持多个租户。每个租户都有一个带ASP membership tables的独立数据库。 DI允许我在运行时切换连接字符串,从而使核心应用程序不知道每个租户使用哪个数据库。 Windsor正在控制DI,它“知道”哪个租户通过网址发出请求:
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

迈克哈德洛writes about this technique。我只是想将SqlMembershipProvider集成到他对这个IoC设计的使用中。

1 个答案:

答案 0 :(得分:3)

假设您的会员提供商配置如下:

<membership>
    <providers>
        <clear/>
        <add name="www.tenant1.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
        <add name="www.tenant2.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
    </providers>
</membership>

你可以让Windsor选择合适的提供者:

var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<MembershipProvider>()
    .LifeStyle.Transient
    .UsingFactoryMethod(() => Membership.Providers[HttpContext.Current.Request.Url.Host]));
... (your controller registrations, etc)