gpt4 book ai didi

asp.net-mvc - 将 MembershipProvider 注入(inject) ASP.NET MVC AccountController

转载 作者:行者123 更新时间:2023-12-04 12:44:20 25 4
gpt4 key购买 nike

ASP.NET MVC 1.0 项目模板包括 AccountController类,它支持构造函数注入(inject):

public AccountController(IFormsAuthentication formsAuth, 
IMembershipService service)
{
FormsAuth = formsAuth ?? new FormsAuthenticationService();
MembershipService = service ?? new AccountMembershipService();
}

一个 AccountMembershipService类也包括在内,它也支持构造函数注入(inject):
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}

我相信你们中的许多人已经将它们用于单元测试,但我的目标是注入(inject) SqlMembershipProvider使用 Windsor,因此在运行时使用 Windsor XML 文件而不是 web.config 对其进行配置。换句话说, 我想对 AccountMembershipService 使用构造函数注入(inject)类(class) ,并且我想继续使用内置的 ASP.NET 2.0 成员(member)系统。我只是想让成员(member)系统的配置通过 Windsor IoC。

不写我自己的 MembershipProvider 是否可行,或者 SqlMembershipProvider与 IoC 打得不好?

From MSDN: "The SqlMembershipProvider constructor is called by ASP.NET to create an instance of the SqlMembershipProvider class as specified in the configuration for the application. This constructor is not intended to be used from your code."



我相信 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 设计的使用。

最佳答案

假设您的成员(member)提供商配置如下:

<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)

关于asp.net-mvc - 将 MembershipProvider 注入(inject) ASP.NET MVC AccountController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/922891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com