Pregunta

Estoy investigando el uso de Autofac en nuestra aplicación web que había usado anteriormente Castle Windsor en el pasado.

Lo que realmente me gusta de Autofac es poder expresar la construcción dinámica de componentes a través de expresiones lamda, en lugar de crear DependancyResolvers, etc. en Windsor.

Un escenario que tengo es que quiero que un componente en particular se registre en el alcance del nivel de sesión ASP.NET. Con Windsor crearía / obtendría un nuevo LifestyleManager, sin embargo, con Autofac se me ocurrió esto:

//Register SessionContext at HTTP Session Level
builder.Register(c =>
{
    HttpContext current = HttpContext.Current;

    //HttpContext handes delivering the correct session
    Pelagon.Violet.Core.Interfaces.SessionContext instance = current.Session["SessionContext"] as Pelagon.Violet.Core.Interfaces.SessionContext;

    if (instance == null)
    {
        instance = c.Resolve<Pelagon.Violet.Core.Interfaces.SessionContext>();
        current.Session["SessionContext"] = instance;
    }

    return instance;
})
.FactoryScoped();

Que en algún momento podría convertirme en un método de extensión. Acepto que esta implementación bombardeará si HttpContext.Current.Session es nulo, ya que solo debe usarse en una aplicación web.

La pregunta es:

¿Cuál es la mejor práctica para tal registro en Autofac? He visto mucha mención sobre el uso de contenedores anidados, etc., pero no hay ejemplos concretos, y estoy ansioso por entender qué podría estar mal con el enfoque anterior (lo único que puedo pensar es en el material de eliminación automática).

Gracias.

¿Fue útil?

Solución

Esto se ve bien.

Marcar el componente 'ExternallyOwned ()' asegurará que Autofac no llame a Dispose () en él.

Los únicos problemas aquí son que su componente con alcance de sesión podría resolver sus propias dependencias a través del contenedor actual y, por lo tanto, contener referencias a cosas que pueden pertenecer a la solicitud actual (por ejemplo). Esto debería ser fácil de detectar prueba sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top