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)