2011-01-13 11 views
1

ウィンザーに登録してください。オープン・ジェネリック・タイプのジェネリック・サービスのためのオープン・ジェネリック・タイプ・コンポーネント

私は以下のような状況があります。テストは合格、私はGenericCommandHandlerに与えられたタイプの数が限られているので、私は、以下のものと一緒に暮らすことができる

IHandler<GenericCommand<>> 

の実装として

GenericCommandHandler<> 

としてオープンジェネリック型を登録したいと私はそれらをすべて個別に登録することができますが、もっと "自動化"したいと思っています。

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) 
    { 
    } 
} 

答えて

2

アルトゥルを参照してください。これらをサポートする.NETフレームワークのAPI。あなたはこれをハックする可能性があるので、ほとんどの場合(ウィンザーの問題追跡ツールでこれをサポートするチケットが開かれている)動作しますが、APIに組み込まれた降下がないと、動作させることが重要な作業になります。

at this blogpost of mineという特定のコンポーネントの問題に取り組むことができます。おそらくそれはあなたの必要性に十分であろう。

+0

今、あなたの記事とジミーミラーの両方を読んでいます。ありがとう、これは動作するはずです。 – Artur

0

IIRCウィンザーには、ジェネリック型定義(つまり、MakeGenericType()を呼び出すことができるタイプ)が必要です。

IHandler<GenericCommand<>>(擬似コード、コンパイルもしません)はジェネリック型定義ではありません。フリータイプのパラメータがネストされているため、MakeGenericType()を呼び出すことはできません。

http://www.ideone.com/0WsMZを参照して、これを明確にするための少しのテストを行ってください。

何を求めていることは半閉鎖ジェネリック医薬品のためのサポートされていないとマウリシオが述べたように何があるのです、また、「ジェネリック型定義」、「オープンジェネリック型」を定義MSDN page about Type.IsGenericType、など