代码之家  ›  专栏  ›  技术社区  ›  Robert Claypool

向ASP.NET MVC AccountController中插入成员身份提供程序

  •  7
  • Robert Claypool  · 技术社区  · 16 年前

    ASP.NET MVC 1.0项目模板包括 会计主管 类,它支持构造函数注入:

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

    帐户成员身份服务 类也包括在内,它也支持构造函数注入:

    public AccountMembershipService(MembershipProvider provider)
    {
        _provider = provider ?? Membership.Provider;
    }
    

    我相信你们中的许多人已经将这些用于单元测试,但我的目标是注入 SqlMembershipProvider 使用windsor,因此在运行时使用windsor xml文件而不是web.config配置它。换言之, 我想对AccountMembershipService类实际使用构造函数注入 ,我想继续使用内置的ASP.NET 2.0成员资格系统。我只想让会员制的配置通过温莎国际奥委会。

    在不编写自己的成员资格提供程序的情况下,是否可以这样做,或者sqlmembershipprovider与IOC的配合不好?

    From MSDN :“ASP.NET调用sqlMembershipProvider构造函数以创建应用程序配置中指定的sqlMembershipProvider类的实例。这个构造函数是 不打算从您的代码中使用 ."

    我相信 Phil asked a very similar question 但是我没有足够的经验去摸索 the answers 他收到了。

    谢谢你的帮助。


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

    迈克哈德洛 talks about this technique here. 我只是想把sqlmembershipprovider集成到他使用这个IOC设计中。

    再次感谢。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Mauricio Scheffer    16 年前

    假设您的成员资格提供程序配置如下:

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