2011-06-05 75 views
8

Castle Windsor刚刚推出了一个Fluent界面,用于注册组件,以替代在配置文件中使用XML。如何使用此Fluent界面注册通用接口你如何使用Castle Windsor - Fluent Interface来注册一个通用接口?

为了说明,我有:

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

这是由一些所谓的类实现。现在,如果我想注册这个,我做这样的事情......

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

如何继续在这个注册?执行非通用接口的过程不起作用。

回答

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(); 
} 
+0

感谢您的回答。什么是“EventRepository”? – Phil 2011-06-05 04:59:33

+0

@菲尔:有些课。你可以编写你自己的查询/安装程序。 – 2011-06-05 05:01:42

+0

更新了帖子! – danyolgiax 2011-06-05 05:05:51

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>)); 

正如你所看到的,你可以解决开放的任何封闭的版本通用接口。

+0

好点。我正在寻找任何解决方案;我只需要它的工作。这个想法是现在就开始工作,如果需要稍后修改。这就是为什么我放弃了这个方法。感谢您的洞察力。 – Phil 2011-06-05 13:47:49

+0

请给我一个如何通过windsor解决这个问题的例子。当我尝试时,问题在于Foo本身不是泛型的,所以我得到如下异常=> System.InvalidOperationException:Fooing.Foo不是GenericTypeDefinition。 MakeGenericType只能在Type.IsGenericTypeDefinition为true的类型上调用。 – Phil 2011-06-05 15:07:20

+0

@Phil:查看我的更新。 – Steven 2011-06-05 15:16:05