Pregunta

Tengo una aplicación en la que un objeto compartido necesita una referencia a un objeto por solicitud.

Shared:      Engine
                |
Per Req:  IExtensions()
                |
             Request

Si intento para inyectar el IExtensions directamente en el constructor de Engine, incluso como Lazy(Of IExtension), consigo un "No alcance coincidente [Petición] es visible desde el ámbito en el que se pidió a la instancia." excepción cuando se trata de crear una instancia de cada IExtension.

¿Cómo puedo crear una instancia HttpRequestScoped y luego inyectarla en una instancia compartida?

práctica sería considerado bueno para ponerlo en la fábrica de la Request (y por lo tanto Engine inyectar en RequestFactory)?

¿Fue útil?

Solución

Debido a los requerimientos de toda la vida compartidos de Engine que no puede inyectar extensiones de petición con ámbito en ella. Lo que podría tener es un método o propiedad en el motor que resolverá de forma activa un conjunto de extensiones del ámbito solicitud actual.

Así que, primero, dejar Engine tomar una dependencia constructor:

public class Engine
{
    public Engine(..., Func<IExtensions> extensionsPerRequest) 
    {
        _extensionsPerRequest = extensionsPerRequest;
    }


    public IExtensions Extensions
    {
       get { return _extensionsPerRequest(); }
    }
 }

Y entonces, en su registro Autofac:

builder.Register<Func<IExtensions>>(c => RequestContainer.Resolve<IExtensions>());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top