我有一個具有一定數量的相同通用接口實現的程序集。 我使用溫莎以下登記註冊所有的人都在一個鏡頭:Castle Windsor解析通用接口數組
Types
.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(IQuery<,>))
現在我想獲得所有註冊的實現數組,但如果我試試這個城堡炸彈:
container.ResolveAll(typeof (IQuery<,>))
爲什麼?
我有一個具有一定數量的相同通用接口實現的程序集。 我使用溫莎以下登記註冊所有的人都在一個鏡頭:Castle Windsor解析通用接口數組
Types
.FromAssembly(Assembly.GetExecutingAssembly())
.BasedOn(typeof(IQuery<,>))
現在我想獲得所有註冊的實現數組,但如果我試試這個城堡炸彈:
container.ResolveAll(typeof (IQuery<,>))
爲什麼?
@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
呼籲所有的疑問共同實施。
它不起作用,因爲你的服務被註冊爲具體類型的實現。將WithService.FromInterface()
子句添加到您的註冊碼中,將其註冊爲接口抽象。國際海事組織也不會工作(與開放式泛型分辨率)。
什麼是例外? –
那麼期望是這個接口實現的數組,這實際上是一個,如果我在運行時檢查容器調試。但是,如果我嘗試使用通用接口城堡解決所有問題,請拋出一個異常,說它無法解析通用接口數組。 – Raffaeu
由於Windsor不知道爲您創建什麼,因此無法解析開放泛型類型。你將不得不指定一個封閉的泛型類型,比如'container.ResolveAll(typeof(IQuery))'。 –
Steven