2014-06-27 48 views
0

我有一個具有一定數量的相同通用接口實現的程序集。 我使用溫莎以下登記註冊所有的人都在一個鏡頭:Castle Windsor解析通用接口數組

Types 
    .FromAssembly(Assembly.GetExecutingAssembly()) 
    .BasedOn(typeof(IQuery<,>)) 

現在我想獲得所有註冊的實現數組,但如果我試試這個城堡炸彈:

container.ResolveAll(typeof (IQuery<,>)) 

爲什麼?

+0

什麼是例外? –

+0

那麼期望是這個接口實現的數組,這實際上是一個,如果我在運行時檢查容器調試。但是,如果我嘗試使用通用接口城堡解決所有問題,請拋出一個異常,說它無法解析通用接口數組。 – Raffaeu

+1

由於Windsor不知道爲您創建什麼,因此無法解析開放泛型類型。你將不得不指定一個封閉的泛型類型,比如'container.ResolveAll(typeof(IQuery ))'。 – Steven

回答

0

@Steven是對的,在不知道它們嵌入的類型的情況下,不可能解析泛型。然而,有兩種方式來回避問題

要麼你有可能的輸入和輸出類型的封閉列表,可以在其上,以便重複,以解決所有特定的組合

for var Type1 in PossibleTypes1 
    for var Type2 in PossibleTypes2 
     var list = container.ResolveAll(typeof(IQuery<,>).MakeGenericType(Type1, Type2) 

這不是真正的優雅但你可以得到你所有的疑問。不過,我想提出第二個選擇。

如果你想解決所有的查詢,你必須有一個操作你想調用他們,或一些你想擺脫的信息。如果是這樣,那麼這個操作或信息應該存在於通用接口繼承的基本非通用接口中。比方說,你想要得到的操作名稱,你可以這樣做:

public interface IBaseQuery { 
    string getOperationName(); // your common operation 
} 

public interface IQuery<In, Out>: IBaseQuery { 
} 

然後,您可以註冊您的IQuery實現對他們的所有接口和解決IBaseQuery呼籲所有的疑問共同實施。

0

它不起作用,因爲你的服務被註冊爲具體類型的實現。將WithService.FromInterface()子句添加到您的註冊碼中,將其註冊爲接口抽象。國際海事組織也不會工作(與開放式泛型分辨率)。

相關問題