2010-11-21 7 views
1

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) 
    { 

    } 
} 

Antwort

2

Wenn ich richtig verstehe, ist das Problem, dass Sie nicht im Voraus wissen, welcher Implementierungstyp für IScheduledTask verwendet wird, s o Sie können es nicht normal registrieren. Wenn dies der Fall ist, ist IComponentActivator nicht der richtige zu verwendende Erweiterungspunkt. Versuchen Sie stattdessen ILazyComponentLoader.

Wenn Sie tun wissen, welche mögliche IScheduledTask-Implementierungen das Programm möglicherweise verwenden, scan and register them normally.

+0

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? –

+0

@the_drow: entweder die Komponenten normal registrieren und den Typnamen als Komponentenname zuweisen; oder sie ohne Servicetyp registrieren. –

+0

@Mauricio Scheffer: So sollte es täglich gemacht werden? –

Verwandte Themen