2017-01-03 3 views
4

(Etwas vereinfachte Szenario, um das spezifische Problem hervorzuheben).Castle Windsor Auflösung null oder mehr Implementierungen

Ich versuche Castle Windsor zu verwenden, um eine Komponente zu lösen, die einen Konstruktor mit einem einzigen Parameter aufweist, die eine Anordnung von einer Dienstschnittstelle ist:

public class TestClass<T> 
{ 
    public TestClass(IService<T>[] services) 
    { 
     ... 
    } 
} 

Der Windsor Behälter konfiguriert ist, die verwenden ArrayResolver :

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel)); 

Das alles funktioniert gut, und einen oder mehrere Dienste sind für verschiedene Instanzen von T.

für einige T

jedoch injiziert, gibt es keine DURCHFÜHRU Mitteilungen von IService<T>. Das Ziel wäre, dass der Konstruktor mit einem Array der Länge null aufgerufen wird.

Das Problem ist, wenn es keine konkreten Implementierungen von IService für ein gegebenes T gibt, wie registriere ich die Definition von IService ohne Implementierung, so dass der Container den Typ kennt?

Ich bin Strom mit:

container.Register(
    Classes.FromAssembly(Assembly.GetExecutingAssembly()) 
     .BasedOn<IService<>>() 
     .WithService.FirstInterface()); 

aber da dies von den konkreten Klassen angetrieben wird, ist es offensichtlich nicht ‚ungenutzt‘ IService Registrierung.

Fallback ist eine Stub-Implementierung von IService für jedes T, das keine "echte" Implementierung hat, aber ich würde es vorziehen, den Code nicht mit vielen solchen Stubs zu verschmutzen. (Könnte auch durch eine offene generische mit etwas Reflexion bieten ...).

Antwort

4

Beantwortung meiner Frage, nachdem es von einem Kollegen gerichtet ...

die ArrayResolver mit einem zweiten Parameter Registrierung gibt leere Arrays ermöglicht - was der Fall ist, wenn die betreffende Komponente nicht registriert ist:

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true)); 

so ist das Verhalten genau wie gewünscht.

Verwandte Themen