Frage

Die Dokumentation für Autofac hat eine interessante Seite beschreibt seine Fähigkeit, erzeugen automatisch delegieren Fabriken . Es ist auch stark darauf hin, dass Sie ähnliche Ergebnisse ohne Autofac durch sie zu schreiben mit der Hand zu bekommen.

Ich bin mit Unity für IoC und würde den Behälter um auf Objekte zu vermeiden, wie beiläufig, dass Notwendigkeit, andere Objekte zu erstellen, so wie würden Sie einen Delegaten Fabrik ohne Autofac schreiben?

War es hilfreich?

Lösung

Nun, ich habe die Einheit nie so weit verwendet, so meine Antwort ziemlich vage.

Das Prinzip ist einfach. Sie definieren einige Delegierte, die Fabriken vertreten. Dann erstellen Sie eine ‚factory'-Klasse, die öffentliche Methoden hat, die die Delegierten übereinstimmt. Diese Klasse kennt den Behälter. Jetzt können Sie die Delegaten und Satz, dass die Klasse als Implementierung registrieren. Dann können Sie nur die Delegierten injizieren. Wenn Sie den injizierten Delegierten aufrufen, wird die Fabrik-Klasse aufgerufen, die den Behälter kennt und fragt den Behälter für eine neue Instanz.

Zuerst definieren Sie Ihre Fabrik-Teilnehmer.

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

Das Sie ein generisches Werk erstellen:

/// <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)});
    }
}

Nun, was Sie den Delegaten registrieren, so etwas wie folgt aus:

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

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

Nun andere injizieren Sie mit anderen Komponenten nur die ‚Provider‘ anstelle des Behälters.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top