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.
Das hat mich angefangen - vielen Dank! – GraemeF