3 Stimmen

Castle ResolveAll liefert ein leeres Array

Meine Baugruppe (TestAssembly) sieht folgendermaßen aus

Class BaseClass
{
....
....
}

Interface I1
{
....
....
}

Interface I2 : I1
{
....
....
}
Interface I3 : I1
{
....
....
}
Class A : BaseClass, I2
{
....
....
}

Class B : BaseClass, I3
{
....
....
}

Ich verwende Castle Windsor, um alle diese Komponenten zu registrieren und aufzulösen.

container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
                            .BasedOn<I1>()
                            .LifestyleSingleton());

In der Folge versuche ich, alle Typen von I1 (Schnittstelle I1) aufzulösen, indem ich

container.ResolveAll<I1>();

in der Hoffnung, ein Array der Objekte A und B zu erhalten. Stattdessen erhalte ich ein leeres Array. Was ist los?

5voto

Hans Jonus Punkte 385

Ich glaube, Sie müssen dem Container mitteilen, welche Dienste mit der Schnittstelle verknüpft werden sollen, etwa so:

container.Register(AllTypes.FromAssemblyNamed("TestAssembly")
    .BasedOn<I1>()
    .WithServiceBase()
    .LifestyleSingleton());

1voto

user1178376 Punkte 898

Ich scheine Antworten auf meine Fragen gefunden zu haben (siehe meine Kommentare zu Hans Jonus' Antwort).

Im Falle der Schnittstellenvererbung gibt es eine fließende API, in der Sie angeben können, welche Schnittstelle der Dienst verwenden soll.

Nehmen Sie das in der Frage genannte Beispiel:

container.Register(Classes.FromAssemblyNamed("TestAssembly")
                   .BasedOn<I1>()
                   .WithService.FirstInterface());  

So können Sie eine bestimmte Instanz der Klassen A und B auflösen, indem Sie

I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();

Oder wenn Sie wollen, dass alle Instanzen, die die Basisschnittstelle implementieren ( I1 ), müssen Sie sich auf diese Weise anmelden.

container.Register(Classes.FromAssemblyNamed("TestAssembly")
                   .BasedOn<I1>()
                   .WithService.AllInterfaces()
                   );

Auf diese Weise können Sie tun, was Sie wollen, meine ich.

I2 ObjA = container.Resolve<I2>();
I3 ObjB = container.Resolve<I3>();
I1[] ObjArray = container.ResolveAll<I1>();

Dies vergrößert jedoch den Behälter. Ich bin nicht sicher, wie sich dies auf die Leistung auswirkt. Ich werde meine Ergebnisse veröffentlichen, sobald ich sie herausgefunden habe. Ich freue mich über jeden Kommentar zu diesem Thema. Danke!

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