7

Asp.Net MVC 1.0项目模板包括的AccountController类,它支持构造器注入:注入的MembershipProvider成ASP.Net MVC的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类的实例,此构造是不打算从你的代码使用。”

我相信Phil asked a very similar question,但我没有足够的经验,他得到了the answers

感谢您的帮助。


更新: 要说清楚,我通过DI提供应用程序MembershipProvider的原因是为了支持多个租户。每个租户都有一个与 ASP membership tables隔离的数据库。 DI允许我在运行时切换连接字符串,从而使核心应用程序不必知道每个租户使用哪个数据库。温莎控制DI和它“知道”该租户通过URL发出请求:
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

迈克哈德洛talks about this technique here.我只是想SqlMembershipProvider的融入他使用这种IoC的设计。

再次感谢。

+0

一个细节,可能打击这种开放:什么是会员。AccountMembershipService的构造函数中的提供程序? – 2009-05-28 20:21:07

+0

.Provider是“使用System.Web.Security.MembershipProvider抽象基类公开的应用程序的默认成员资格提供程序”。 – 2009-05-28 20:26:45

回答

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> 

你可以有温莎选择合适的供应商是这样的:

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)