7

Asp.Net MVC 1.0 dự án mẫu bao gồm một AccountController lớp, mà hỗ trợ constructor tiêm:Tiêm một MembershipProvider vào ASP.Net MVC AccountController

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

Một AccountMembershipService lớp cũng được bao gồm, và nó quá hỗ trợ việc xây dựng hệ thống tiêm:

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

Tôi chắc rằng nhiều bạn đã sử dụng để thử nghiệm đơn vị, nhưng mục tiêu của tôi là tiêm SqlMembershipProvider sử dụng Windsor và do đó định cấu hình nó khi chạy bằng tệp Windsor xml thay vì web.config. Nói cách khác, Tôi thực sự muốn sử dụng hàm tạo constructor cho lớp AccountMembershipService và tôi muốn tiếp tục sử dụng hệ thống thành viên ASP.Net 2.0 được tích hợp sẵn. Tôi chỉ muốn cấu hình của hệ thống thành viên để đi qua Windsor IoC.

Điều này có thể thực hiện mà không cần viết MembershipProvider của riêng tôi hay không SqlMembershipProvider không hoạt động tốt với IoC?

From MSDN: "Các nhà xây dựng SqlMembershipProvider được gọi bằng ASP.NET để tạo ra một thể hiện của lớp SqlMembershipProvider như quy định trong cấu hình cho các ứng dụng constructor Đây là không nhằm phản ánh được sử dụng từ mã của bạn."

Tôi tin rằng Phil asked a very similar question, nhưng tôi không đủ kinh nghiệm để grok the answers ông nhận được.

Cảm ơn sự giúp đỡ của bạn.


CẬP NHẬT: Chỉ cần rõ ràng, lý do tôi bổ sung MembershipProvider của ứng dụng qua DI là hỗ trợ nhiều người thuê. Mỗi người thuê nhà có một cơ sở dữ liệu riêng biệt với ASP membership tables. DI cho phép tôi chuyển đổi các chuỗi kết nối khi chạy và do đó giữ cho ứng dụng lõi bất khả tri về cơ sở dữ liệu nào đang được sử dụng cho từng đối tượng thuê. Windsor đang kiểm soát DI và "biết" người thuê nhà đưa ra yêu cầu qua url:
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

Mike Hadlow talks about this technique here. Tôi chỉ đang cố gắng tích hợp SqlMembershipProvider vào việc sử dụng thiết kế IoC này.

Xin cảm ơn một lần nữa.

+0

Một chi tiết mà có thể thổi này mở: Membership là gì .Provider trong constructor cho AccountMembershipService? –

+0

.Provider là "Nhà cung cấp thành viên mặc định cho ứng dụng được hiển thị bằng lớp cơ sở trừu tượng System.Web.Security.MembershipProvider." –

+0

Nếu hàm tạo AccountMembershipService nhận một nhà cung cấp null, Membership.Provider sẽ trả về SqlMembershipProvider (được khởi tạo bởi thời gian chạy) dựa trên các thiết lập web.config. Đó là hành vi tôi muốn thay thế qua Windsor. –

Trả lời

3

Giả sử bạn đã cung cấp thành viên của bạn cấu hình một cái gì đó như thế này:

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

bạn có thể có Windsor chọn nhà cung cấp phù hợp như thế này:

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

Làm việc như một sự quyến rũ! Cảm ơn bạn mausch. –