2011-06-05 76 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