framework - Inyectar un MembershipProvider en ASP.Net MVC AccountController
login entity framework c# mvc (1)
Suponiendo que tiene sus proveedores de membresía configurados de la siguiente manera:
<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>
puede hacer que Windsor seleccione el proveedor adecuado de esta manera:
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)
Las plantillas de proyectos de Asp.Net MVC 1.0 incluyen una clase AccountController , que admite la inyección de constructores:
public AccountController(IFormsAuthentication formsAuth,
IMembershipService service)
{
FormsAuth = formsAuth ?? new FormsAuthenticationService();
MembershipService = service ?? new AccountMembershipService();
}
También se incluye una clase AccountMembershipService , que también admite la inyección de constructores:
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
Estoy seguro de que muchos de ustedes lo han usado para pruebas unitarias, pero mi objetivo es inyectar un SqlMembershipProvider usando Windsor, y así configurarlo en tiempo de ejecución usando los archivos Windsor xml en lugar de web.config. En otras palabras, quiero usar la inyección de constructor para la clase AccountMembershipService , y quiero continuar usando el sistema integrado de membresía ASP.Net 2.0. Solo quiero que la configuración del sistema de Membresía pase por Windsor IoC.
¿Es esto posible sin escribir mi propio MembershipProvider, o SqlMembershipProvider no funciona bien con IoC?
Desde MSDN : "ASP.NET llama al constructor SqlMembershipProvider para crear una instancia de la clase SqlMembershipProvider como se especifica en la configuración de la aplicación. Este constructor no está destinado a ser utilizado desde el código ".
Creo que Phil hizo una pregunta muy similar , pero no tengo la experiencia suficiente para asimilar las respuestas que recibió.
Gracias por tu ayuda.
ACTUALIZACIÓN: Para que quede claro, la razón por la cual aprovisioné el MembershipProvider de la aplicación a través de DI es para dar soporte a varios inquilinos. Cada inquilino tiene una base de datos aislada con tablas de miembros ASP . DI me permite cambiar las cadenas de conexión en tiempo de ejecución y así mantener la aplicación núcleo independiente de qué base de datos se está utilizando para cada inquilino. Windsor controla la DI y "sabe" qué inquilino realiza la solicitud a través de la url:var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Mike Hadlow habla sobre esta técnica aquí. Solo intento integrar SqlMembershipProvider en su uso de este diseño de IoC.
Gracias de nuevo.