2011-01-13 11 views
1

Ich hoffe, der Titel macht zumindest Sinn.Registrieren Sie in Windsor eine offene generische Typkomponente für generischen Service des offenen generischen Typs

Ich habe die Situation wie in dem Code unten. Verläuft der Test erfolgreich, aber ich würde

GenericCommandHandler<> 

als offene generische Typ als Implementierung für

IHandler<GenericCommand<>> 

ich mit dem, was unten leben können, registrieren lassen möchten, da die Anzahl der Typen GenericCommandHandler gegeben ist begrenzt und Ich kann sie alle einzeln registrieren, möchte aber etwas "automatisierter".

using Castle.MicroKernel.Registration; 
using Castle.Windsor; 
using NUnit.Framework; 

[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void t() 
    { 
     using(var container = new WindsorContainer()) 
     { 
     // HOW TO REGISTER IT AS OPEN GENERIC TYPE? 
     container.Register(
      Component.For<IHandler<GenericCommand<object>>>() 
       .ImplementedBy<GenericCommandHandler<object>>()); 

     var handler = container.Resolve<IHandler<GenericCommand<object>>>(); 
     } 
    } 
} 

public interface IHandler<TCommand> 
{ 
    void Handle(TCommand o); 
} 

public class GenericCommand<T> 
{ 
} 

public class GenericCommandHandler<T> : IHandler<GenericCommand<T>> 
{ 
    public void Handle(GenericCommand<T> o) 
    { 
    } 
} 

Antwort

2

Artur,

für die Unterstützung ist für halbgeschlossene Generika Was Sie fragen definiert und als Mauricio erwähnt gibt es keine API im .NET Framework, um diese zu unterstützen. Man könnte das einhacken, so dass es in den meisten Fällen funktioniert (es gibt ein Ticket in Windsors Issue Tracker, um dies zu unterstützen), aber mangelnde Abkömmlinge in der API würden bedeuten, dass es ein erheblicher Aufwand wäre, es zum Laufen zu bringen.

Sie können einen Blick at this blogpost of mine, die das Problem für bestimmte Komponente angeht. Vielleicht würde das für Ihre Bedürfnisse ausreichen.

+0

Jetzt erinnere ich mich, Ihren Artikel und Jimmy Miller zu lesen. Danke, das sollte funktionieren. – Artur

0

IIRC Windsor erfordert allgemeine Typdefinitionen (das heißt Arten Sie können Makegenerictype() aufrufen, auf).

IHandler<GenericCommand<>> (Pseudocode, nicht einmal kompilieren) ist keine generische Typdefinition, Sie können MakeGenericType() nicht aufrufen, weil der freie Typparameter verschachtelt ist.

Siehe http://www.ideone.com/0WsMZ für einen kleinen Test, der dies verdeutlichen sollte. Siehe auch die MSDN page about Type.IsGenericType, die als „generische Typdefinition“, „offene generische Typen“ usw.