3 Stimmen

Festlegen, welche Abhängigkeit bei der Ctor-Injektion mit CastleWindsor 2.5.1.0 verwendet werden soll

Ich habe eine Klasse mit einem Konstruktor wie diesem

public class BlotterService : IBlotterService
{
    public BlotterService(IAService aService, IAnotherService anotherService)
    {
        // ...  
    } 
}

und registrierte Abhängigkeiten wie diese

// Default lifecycle is Singleton
Component.For<IAnotherService >().ImplementedBy<AnotherService >()
Component.For<IAService>().ImplementedBy<AService>() // instance 1 of AService
Component.For<IAService>().ImplementedBy<AService>().Named(
                    "aServiceAlternativeForBlotter") // instance 2 of AService
Component.For<IBlotterService>().ImplementedBy<BlotterService>()

Normalerweise, wenn Klassen, die IAService benötigen, instanziiert werden, möchte ich die erste Instanz von AService, jedoch im speziellen Fall von BlotterService, ich möchte Instanz 2 von AService.

Wie kann ich BlotterService/AService mit dem Schlosscontainer registrieren, um dies zu erreichen?

EDIT: Aktualisierung

Ich verwende Castle 2.5.1.0 und kann leider nicht aktualisieren.

8voto

Mark Seemann Punkte 216836

Ändern Sie die letzte Registrierung in:

Component
    .For<IBlotterService>()
    .ImplementedBy<BlotterService>()
    .DependsOn(Dependency.OnComponent(
        typeof(IAService),
        "aServiceAlternativeForBlotter"))

2voto

jonnii Punkte 27657

Es gibt hier viele richtige Antworten, aber du hängst bei 2,5 fest, also denke ich, dass du so etwas machen musst:

Component.For<IBlotterService>()
    .ImplementedBy<BlotterService>()
    .ServiceOverrides(
        ServiceOverride.ForKey("aService").Eq("aServiceAlternativeForBlotter"));

Wenn dies nicht funktioniert, dann eine andere Alternative ist Sie eine Schnittstelle abgeleitet von IService namens IAlternateService erstellen könnte, und haben dann eine Abhängigkeit von, dass...

1voto

Miguel Madero Punkte 1948

Während der Registrierung von BlotterService müssen Sie seine Abhängigkeit mit einem Override angeben.

Component.For<IBlotterService>().ImplementedBy<BlotterService>().ServiceOverrides(
                new { aService = "aServiceAlternativeForBlotter" })

Oder Sie könnten eine der DependsOn-Überschreibungen verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X