2010-11-24 6 views
1

Dies ist wahrscheinlich eine dumme Frage, aber können Delegaten oder Ereignisse in einem IOC-Container (z. B. Windsor) registriert werden?Können Delegierte mit Schloss Windsor IOC Container registriert werden?

Ich plane die Registrierung von Ereignis-Funktionalität zum Zeitpunkt des Starts der Anwendung und implementiert das Strategie-Muster.

Eine Alternative wäre, einfach Delegaten in Typen für die Registrierung mit dem Container zu wickeln, nehme ich an.

Antwort

7

Sie müssen keine Funktionen umbrechen oder Unterklassen erstellen, um sie in Windsor zu registrieren. Sie funktionieren genau wie jede andere Komponente. Wenn Sie einem anderen eine Func<int> mitteilen müssen, verwenden Sie benannte Komponenten und Service-Overrides wie bei jeder anderen Komponente. Beispiel:

[Test] 
public void Example() { 
    var container = new DefaultKernel(); 
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42")); 
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44")); 
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44"))); 
    var s = container.Resolve<Something>(); 
    Assert.AreEqual(44, s.I); 
} 

class Something { 
    private readonly int i; 
    public Something(Func<int> f) { 
     i = f(); 
    } 

    public int I { 
     get { return i; } 
    } 
} 

Wenn Sie suchen Ihre Event Registrierungen mit dem Behälter zu entkoppeln, benutzen Sie einfach die Event wiring facility.

+0

Vielen Dank dafür. Dies scheint eine mächtige Einrichtung zu sein. – Ben

0

Ich würde sagen, das ist nicht möglich, denn wie würden Sie die Abhängigkeit lösen?

Wenn eine Klasse nach einem Delegaten vom Typ Func<bool> fragt, wie würden Sie zwischen verschiedenen Delegaten unterscheiden?

Ihre Alternative, den Delegaten zu umhüllen, wäre die beste Lösung, da Sie Delegierte in funktionalen Abschnitten benennen und kombinieren können.

BEARBEITEN Schloss Windsor hat eine Möglichkeit, Instanzen zu benennen, wie sie im IOC registriert sind. Es ist also möglich, aber Sie müssen jeder Instanz einen Namen geben. Siehe Mauricio Scheffers answer.

+0

Gute Punkt re Auflösung. Ich werde mit der Verpackung der Delegierten gehen. Wäre schön, wenn man benannte Funktionen wie benannte Typen umgehen könnte. – Ben

+0

Sie können Ihre Delegaten immer durch Unterklassenbildung benennen, d. H. Öffentliche Klasse MyDelegate: Func {} –

+0

-1 Es * ist möglich * mit Standard-Windsor-Mechanismen. –

0

Wie bereits erwähnt, funktioniert es gut, seien Sie vorsichtig, wenn Sie die typed factory facility verwenden, da es ein unerwartetes Verhalten zeigen kann. Ihre Delegiertenabhängigkeiten können die Erstellung von Proxyfactorys hervorbringen. Siehe this question.

Verwandte Themen