6

He registrado una clase MembershipProvider personalizada en mi archivo Web.Config. Estoy usando Inversion of Control usando Castle Windsor y he registrado mi clase MembershipProvider personalizada como transitoria (porque también está usando un servicio transitorio).¿Cómo controlo la creación/duración de la instancia de MembershipProvider?

Esto significa que quiero que se vuelva a crear la instancia del proveedor de membresía en cada solicitud web. Actualmente, se crea solo una vez por cada dominio de aplicación, de modo que cuando intenta acceder al servicio del que depende, esa instancia de servicio se reutiliza mientras no se supone que lo haga.

Ahora tengo que encontrar la manera de que Windsor controle la vida útil de mi MembershipProvider personalizado, pero no sé cómo. Esperaba una fábrica sentada en algún lugar de .NET Framework, lo que me permitió anular la creación de la instancia y volver a enrutarla a Windsor, pero no encuentro nada igual.

Por cierto, estoy usando .NET 4.0.

ACTUALIZACIÓN: He aquí algunos de mi código para que pueda ver lo que estoy haciendo exactamente:

Web.Config:

<membership defaultProvider="MyMembershipProvider" > 
    <providers> 
    <clear/> 
    <add name="ApplicationMembershipProvider" 
     type="MyNamespace.MyMembershipProvider, MyAssembly"/> 
    </providers> 
</membership> 

proveedor de suscripciones

public class MyMembershipProvider : MembershipProvider 
{ 
    private IMyService myService; 

    public MyMembershipProvider() : base() 
    { 
     // We should use constructor injection here but since we cannot control 
     // the construction of this class, we're forced to create the dependency 
     // ourselves. 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     if (myService == null) 
     { 
      // This scope is only reached once within the browser session, 
      // ASP.NET keeps the instance of MyMembershipProvider in memory 
      // so the myService field keeps its value across web requests. 
      // This results in Castle Windsor (which I have configured the service 
      // locator to use) not being able to control the lifetime of 
      // the MyService instance. So, the inability of Windsor to control 
      // the lifetime of MembershipProvider instances, inhibits the lifetime 
      // management of MyService instances as well. 
      myService = ServiceLocator.Current.GetInstance<IMyService>(); 
     } 

     return myService.ValidateUser(username, password); 
    } 
} 
+0

¿Puede profundizar en "controlar la vida útil"? ¿Qué (concretamente) quieres lograr? –

+0

@Mauricio: He actualizado mi pregunta en consecuencia (inserto un párrafo después del primero). –

+0

No estoy seguro de entender ... si ha registrado el componente como transitorio * se * volverá a crear cada vez, por definición ... ¿puede publicar su código de registro? –

Respuesta

4

I just blogged about this con una solución.

En pocas palabras, esta solución implica un MembershipProvider simple y reutilizable que llama al contenedor para resolver sus MembershipProviders personalizados. A diferencia de otras soluciones que utilizan funciones de contenedor "BuildUp", este toma el control real de la creación de instancias, lo que permite la inyección del constructor (que a su vez permite la inmutabilidad) y la capacidad de proxi- midad.

+0

Eso es exactamente lo que necesitaba. ¡Muchas gracias! –

+0

Tengo una pregunta: ¿qué decisión impulsa la elección entre liberar o no liberar el contenedor en los miembros de la clase WindsorMembershipProvider reemplazados? –

+0

@Sandor: el componente resuelto se libera en todos los métodos. Ver http://devlicio.us/blogs/krzysztof_kozmic/archive/2010/08/27/must-i-release-everything-when-using-windsor.aspx para justificación. –

2

No se preocupe por su membresíaProvider lifet yo me. Simplemente administre la vida útil de IMyService dentro del proveedor. Cree una propiedad para su IMyService con un getter, y devuelva una nueva instancia (o como quiera administrar la vida) cada vez que se solicite.

+0

Gracias por su sugerencia. Mi punto, sin embargo, es que no debería gestionar la duración de los objetos, sino dejar que Castle Windsor lo haga (Inversión de control), según la configuración de por vida que le entregue. –

+0

Bien. Usted puede hacer eso. Todo desde dentro de su clase MembershipProvider. Solo tiene una propiedad que devuelve un servicio de mensajería instantánea, y esto simplemente devolverá lo que devuelva su contenedor de IoC. – Pedro

+0

Sí, pero eso provocaría que se creara el servicio cada vez que se llame al MembershipProvider dentro de la misma solicitud web. Puedo vivir con eso hasta cierto punto, pero el objetivo es dejar que Castle Windsor administre la vida y no a mí. –

Cuestiones relacionadas