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设计的使用中。
答案 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)