2011-01-13 82 views
1

我希望标题至少有一定意义。在Windsor注册一个开放的泛型类型组件,用于开放泛型类型的通用服务

我有如下代码的情况。测试通过,但我想注册

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来支持这些。你可能会破解它,以便它在大多数情况下都能正常工作(Windsor的问题跟踪器中有一张支持这种情况的门票),但是API中没有建立下降意味着使其工作将是一项重大的工作。

您可以看看at this blogpost of mine,它解决了特定组件的问题。也许这将足以满足您的需求。

+0

现在我记得阅读你的文章和吉米·米勒的。谢谢,这应该工作。 – Artur 2011-01-14 15:59:04

0

IIRC温莎需要泛型类型定义(即类型,您可以致电MakeGenericType())。 (伪代码,甚至不编译)不是泛型类型定义,因为自由类型参数是嵌套的,所以不能调用MakeGenericType()。

请参阅http://www.ideone.com/0WsMZ进行一些小测试,以便澄清这一点。又见MSDN page about Type.IsGenericType,它定义“泛型类型定义”,“开放式泛型类型”等