Ich habe eine Konsolenanwendung, die einen Klassennamen und ruft eine Funktion davon recieves:Wie schreibe ich einen benutzerdefinierten Windsor-Aktivator, der Objekte durch eine Zeichenfolge erstellt?
Assembly asm = Assembly.GetEntryAssembly();
ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName);
IScheduledTask task = (IScheduledTask)oh.Unwrap();
task.Execute();
Bisher gibt es keine Notwendigkeit für die Initialisierung außer dass aufzutreten war, aber jetzt haben wir einige Komponenten, die IScheduledTask auf depand wird , durch Konstruktorinjektion.
Gibt es eine Möglichkeit, eine benannte Instanz mit dem gleichen Namen der Klasse zu definieren, die später alle Abhängigkeiten mithilfe von resolve auflösen wird?
Das heißt, wenn ich „SomeScheduledTask“ als Parameter erhalten kann ich dies tun:
IScheduledTask task = (IScheduledTask)container.Resolve(typeName); // I know this is possible. The problem is the registration.
Kann ich etwas tun, wie dies mein Problem zu beheben:
container.Register(Component.For<IScheduledTask>().Named(t => t.Name).Activator<MyActivator>())
Und in meinem Aktivator wie etwas zu tun dies:
public class MyActivator : IComponentActivator
{
public object Create(CreationContext context)
{
string typeName = context.???; // How do I get the named instance name from here?
Assembly asm = Assembly.GetEntryAssembly();
ObjectHandle oh = Activator.CreateInstance(asm.FullName, typeName);
IScheduledTask task = (IScheduledTask)oh.Unwrap();
task.Execute();
}
public void Destroy(object instance)
{
}
}
Ich weiß, was IScheduledTask das Programm möglicherweise verwenden, ist das Problem, dass ich das Concreate-Objekt zur Laufzeit mit einem Konsolenparameter auflösen. Also was genau soll ich verwenden? –
@the_drow: entweder die Komponenten normal registrieren und den Typnamen als Komponentenname zuweisen; oder sie ohne Servicetyp registrieren. –
@Mauricio Scheffer: So sollte es täglich gemacht werden? –