如何使用Castle Windsor - Fluent Interface来注册通用接口?

8

Castle Windsor刚刚推出了一种流畅的接口来注册组件,作为使用配置文件中的XML的替代方法。我如何使用这个流畅的接口来注册通用接口

为了说明,我有以下内容:

public interface IFoo<T,U>
{    
  public T IToo();   
  public U ISeeU(); 
}

这是由一个名为Foo的类实现的。现在,如果我想要注册它,我需要做如下操作...

var _container = new WindsorContainer();
_container.Register(...);

我该如何注册这个服务?尝试非通用界面的流程无法正常进行。
2个回答

15
这是一些类似于这样的内容吗?
   container.Register(AllTypes.FromAssemblyContaining<YourClass>()
        .BasedOn(typeof(IFoo<,>))
        .WithService.AllInterfaces()
        .Configure(c => c.LifeStyle.Transient));

接口

 public interface IFoo<T, U>
{
    T IToo();
    U ISeeU();
}

谢谢您的回答。"EventRepository"是什么? - Phil
@Phil:有些类。你可以编写自己的查询/安装程序。 - the_drow

4
在您的问题中并不清楚您是否需要将开放泛型接口IFoo<T,U>映射到一个或多个实现,每个实现都实现该接口的闭合版本(批量注册),还是您想将开放泛型接口映射到开放泛型实现。
Danyolgiax给出了批量注册的示例。将开放泛型接口映射到开放泛型实现,可以让您请求指定接口的闭合版本并返回指定实现的闭合版本。映射开放泛型类型的注册通常如下所示:
container.Register(Component
    .For(typeof(IFoo<,>))
    .ImplementedBy(typeof(Foo<,>)));

您可以按照以下步骤解决此问题:
var foo1 = container.Resolve<IFoo<int, double>>();
object foo2 = container.Resolve(typeof(IFoo<string, object>));

正如您所看到的,您可以解决任何开放泛型接口的封闭版本。


好的观点。我正在寻找任何解决方案;我只需要它能够工作。想法是现在让它工作,如果需要稍后再进行修改。这就是为什么我保持了开放的方法。不过还是谢谢你的见解。 - Phil
请给我展示一下如何通过Windsor来解决这个问题的例子。当我尝试时,问题是Foo本身不是泛型,所以我会遇到这样的异常=>System.InvalidOperationException: Fooing.Foo不是一个GenericTypeDefinition。MakeGenericType只能在Type.IsGenericTypeDefinition为true的类型上调用。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接