2009-11-20 13 views
5

Die Dokumentation für Autofac hat eine interessante Seite, die ihre Fähigkeit beschreibt, delegate factories automatisch zu generieren. Es schlägt auch stark vor, dass Sie ähnliche Ergebnisse ohne Autofac erzielen können, indem Sie sie von Hand schreiben.Wie implementiere ich eine Delegiertenfabrik?

Ich verwende Unity für IoC und möchte vermeiden, den Container an Objekte zu übergeben, die andere Objekte erstellen müssen. Wie würden Sie also eine Delegate-Factory ohne Autofac schreiben?

Antwort

6

Nun, ich habe noch nie Einheit verwendet, so ist meine Antwort ziemlich vage.

Das Prinzip ist einfach. Sie definieren einige Delegaten, die Fabriken repräsentieren. Dann erstellen Sie eine "Factory" -Klasse mit öffentlichen Methoden, die den Delegierten entsprechen. Diese Klasse kennt den Container. Jetzt registrieren Sie den Delegaten und legen diese Klasse als Implementierung fest. Dann können Sie nur den Delegierten injizieren. Wenn Sie den injizierten Delegaten aufrufen, wird die Factory-Klasse aufgerufen, die den Container kennt und den Container nach einer neuen Instanz fragt.

Zuerst definieren Sie Ihre Fabrikdelegierten.

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

Das schaffen Sie ein generisches Werk:

/// <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 die Delegaten registrieren, so etwas wie diese:

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 Sie mit anderen Komponenten nur die ‚Provider injizieren "Anstelle des Containers.

+0

Das hat mich angefangen - vielen Dank! – GraemeF

Verwandte Themen