ASP.NET MVC 1.0 project templates include an AccountController
class, which supports constructor injection:
public AccountController(IFormsAuthentication formsAuth,
IMembershipService service)
{
FormsAuth = formsAuth ?? new FormsAuthenticationService();
MembershipService = service ?? new AccountMembershipService();
}
An AccountMembershipService
class is also included, and it too supports constructor injection:
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
I'm sure many of you have used these for unit testing, but my goal is to inject a SqlMembershipProvider
using Windsor, and thus configure it at runtime using Windsor XML files rather than web.config. In other words, I want to use constructor injection for the AccountMembershipService
class, and I want to continue using the built in ASP.NET 2.0 Membership system. I just want the configuration of the Membership system to go through Windsor IoC.
Is this possible without writing my own MembershipProvider, or does SqlMembershipProvider
not play well with 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."
I believe Phil asked a very similar question, here are the answers he received.
Thanks for your help.
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Mike Hadlow writes about this technique. I am just trying to integrate SqlMembershipProvider
into his use of this IoC design.
Assuming you have your membership providers configured something like this:
<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>
you can have Windsor select the appropriate provider like this:
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)