Generics 在Windsor中注册开放泛型类型组件,用于开放泛型类型的泛型服务

Generics 在Windsor中注册开放泛型类型组件,用于开放泛型类型的泛型服务,generics,castle-windsor,registration,Generics,Castle Windsor,Registration,我希望这个标题至少有点道理 我的情况如下面的代码所示。考试通过了,但我想注册 GenericCommandHandler<> GenericCommandHandler 作为实现的开放泛型类型 IHandler<GenericCommand<>> IHandler 我可以接受下面的东西,因为给GenericCommandHandler的类型数量有限,我可以单独注册它们,但我希望更“自动化”一些 使用Castle.MicroKernel.Registr

我希望这个标题至少有点道理

我的情况如下面的代码所示。考试通过了,但我想注册

GenericCommandHandler<> 
GenericCommandHandler
作为实现的开放泛型类型

IHandler<GenericCommand<>>
IHandler
我可以接受下面的东西,因为给GenericCommandHandler的类型数量有限,我可以单独注册它们,但我希望更“自动化”一些

使用Castle.MicroKernel.Registration;
使用温莎城堡;
使用NUnit.Framework;
[测试夹具]
公共班级1
{
[测试]
公屋
{
使用(var container=new WindsorContainer())
{
//如何将其注册为打开泛型类型?
集装箱。登记(
用于()的组件
.ImplementedBy());
var handler=container.Resolve();
}
}
}
公共接口IHandler
{
无效句柄(t命令o);
}
公共类泛型命令
{
}
公共类GenericCommandHandler:IHandler
{
公共无效句柄(generico命令)
{
}
}

IIRC Windsor需要泛型类型定义(即可以在上调用MakeGenericType()的类型)

IHandler
(伪代码,甚至不编译)不是泛型类型定义,不能对其调用MakeGenericType(),因为自由类型参数是嵌套的

请参阅一个小测试,以澄清这一点。另请参见,其中定义了“泛型类型定义”、“开放泛型类型”等

您要求的是对半封闭泛型的支持,正如Mauricio提到的,.NETFramework中没有API支持这些。你可以破解它,这样它在大多数情况下都能正常工作(温莎的问题跟踪程序中有一张支持这一点的票证),但是缺少内置API意味着让它正常工作将是一项巨大的努力


您可以看看,它解决了特定组件的问题。也许这就足够满足你的需要了。

现在我想起读过你的文章和吉米·米勒的文章。谢谢,这应该有用。
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 )
   {
   }
}