2010-05-20 24 views
0

使用Castle Windsor,我想用一個類型參數來配置一個通用服務;並通過已知的具體類型來實現它,該類型實現了具有特定類型的服務作爲通用參數。表現爲一個單元測試,我想獲得以下工作:Castle Windsor:配置一個通用服務並提供非通用實現失敗

[TestClass] 
public class WindsorTests 
{ 
    [TestMethod] 
    public void ResolveGenericEntity_Test() 
    { 
     WindsorContainer container = ConfigureContainer(); 
     IEntity<string> entity = container.Resolve<IEntity<string>>(); 
     Assert.IsNotNull(entity); 
    } 

    private WindsorContainer ConfigureContainer() 
    { 
     WindsorContainer container = new WindsorContainer(); 
     container.AddComponent("entity", typeof(IEntity<>), typeof(ConcreteEntity)); 
     return container; 
    } 
} 

public interface IEntity<T> { } 

public class ConcreteEntity : IEntity<string> {} 

此測試失敗,但以下情況除外:

System.InvalidOperationException: WindsorGenericsTest.ConcreteEntity是 不是GenericTypeDefinition 。 MakeGenericType只能在 上調用 Type.IsGenericTypeDefinition爲true的類型。

現在,我發現了一個描述相同問題的post here。海報描述瞭如何通過更改DefaultGenericHandler.ResolveCore方法來解決這個問題。但是,我不想更改自己的Castle代碼並在自定義版本上運行。

有沒有人知道如何解決這個問題,而無需修改Castle Windsor源代碼?如果這是需要的,我很樂意實施一個設施來支持這一點。

+0

您鏈接到的帖子是錯誤的,它提出了一種解決方法,而不是修復。溫莎是對的,你的註冊是錯誤的。 – 2010-05-20 17:58:37

回答

1

如果將ConfigureContainer中的行更改爲此,它會工作嗎?

container.AddComponent("entity", typeof(IEntity<string>), typeof(ConcreteEntity)); 
+0

是的,但它並不是我所需要的(具體用法是在一個相當複雜的注入對象圖中,我的代碼示例是最短的可能會重現問題)。 – driis 2010-05-20 17:50:46

+0

那麼你需要什麼?這個答案只是解決你問題的正確答案 - 你的'ConcreteEntity'實現'IEntity '而不是'IEntity <>'所以你應該註冊它 – 2010-05-20 17:54:48

相關問題