Pregunta

La documentación de Autofac tiene una página interesante que describe su capacidad para generar automáticamente noreferrer fábricas delegado . También sugiere fuertemente que se pueden obtener resultados similares sin Autofac escribiendo a mano.

Estoy usando la Unidad para la COI y me gustaría evitar que pase el recipiente alrededor de los objetos que necesita para crear otros objetos, así que ¿cómo escribir una fábrica delegado sin Autofac?

¿Fue útil?

Solución

Bueno, yo nunca he usado la Unidad hasta el momento, así que mi respuesta es muy vaga.

El director es simple. Se definen algunos delegados que representan las fábricas. A continuación, se crea una ‘clase factory' que cuenta con métodos públicos que coincide con los delegados. Esta clase conoce el contenedor. Ahora se registra el delegado y establecer esa clase como aplicación. A continuación, puede inyectarse sólo el delegado. Cuando se llama al delegado inyectada, la clase de fábrica se llama, que no conoce el recipiente y pide al contenedor de una nueva instancia.

En primer lugar se definen las fábricas-delegados.

public delegate TServiceType Provider<TServiceType>();
public delegate TServiceType Provider<TArg,TServiceType>(TArg argument);

El crear una fábrica genérica:

/// <summary>
/// Represents a <see cref="Provider{TArg,TServiceType}"/> which holds 
/// the container context and resolves the service on the <see cref="Create"/>-call
/// </summary>
internal class GenericFactory{
    private readonly IContainer container; 

    public ClosureActivator(IContainer container)
    {
        this.container= container;
    } 

    /// <summary>
    ///  Represents <see cref="Provider{TServiceType}.Invoke"/>
    /// </summary>
    public TService Create()
    {
        return container.Resolve<TService>();
    }
    /// <summary>
    /// Represents <see cref="Provider{TArg,TServiceType}.Invoke"/>
    /// </summary>
    public TService Create(TArg arg)
    {        
        return container.Resolve<TService>(new[] {new TypedParameter(typeof (TArg),arg)});
    }
}

Ahora lo que se registra el delegado, algo como esto:

var newServiceCreater = new GenericFactory(container);
container.Register<Provider<MyCompoent>>().To(newServiceCreater.Create);

var newServiceCreater = new GenericFactory(container);
container
    .Register<Provider<OtherServiceWithOneArgumentToConstruct>>()
    .To(newServiceCreater.Create);

Ahora sí que se inyecte a otros componentes sólo el ‘Proveedor’ en lugar del contenedor.

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