2011-06-01 29 views
2

我有一個開放的通用接口,我用一個非泛型類實現,我想用城堡windsor注入這個類,但我掙扎着......使用城堡注入一個非通用實現的開放通用接口

可以說我有以下接口

public interface IMyInterface<T> 
{ 
    bool DoSomething(T param); 
} 

然後我有以下的類,它實現像這樣

public class MyClass : IMyInterface<string> 
{ 
    public bool DoSomething(string param) 
    { 
     // Do Something 
     return true; 
    } 
} 

這個界面我希望能夠ŧ o像這樣使用castle來解析接口,以便injectObject成爲MyClass的一個實例。

WindsorContainer container = new WindsorContainer(new XmlInterpreter(newConfigResource("castle"))); 
IMyInterface<string> injectedObject = container.Resolve<IMyInterface<string>>(); 

這是可能的,還是我有點偏離軌道?如果可能的話,我如何設置城堡配置部分?我已經嘗試使用'1表示法來表示接口是一個開放的泛型類型,但如果實現不是泛型的,那麼在這種情況下它不是泛型。

任何幫助表示讚賞

+0

您是否確定要使用XML來註冊組件?目前的「最佳實踐」是用流利註冊API註冊組件,例如'container.Register(Component.For >()。ImplementedBy ())' – mookid8000 2011-06-01 09:13:17

+0

@ mookid8000這並不意味着如果我想改變一個接口的具體實現我想使用(比如說在真正的和虛假的DAO),我需要更改代碼並重新編譯?通過在城堡xml配置文件中,我可以更改配置並重新啓動服務或應用程序。 – Rob 2011-06-01 09:23:03

+0

是的,這就是它的意思。根據我的經驗,人們往往傾向於認爲在運行時切換實現的能力很酷,但我從未聽說任何人將其付諸實際使用。 – mookid8000 2011-06-01 10:46:52

回答

4

我們用流利的接口在我的球隊,所以它已經有一段時間我看了配置文件的語法。基本原理是這樣的:你的服務是IMyInterface<string>,實現類型是MyClass。所以我認爲它會是這樣的:

<component service="Namespace.IMyInterface`1[[System.String, mscorlib]], AssemblyName" 
     type="Namespace.MyClass, AssemblyName" /> 

你說你得到一個錯誤。什麼是錯誤?我想這是因爲你已經將服務定義爲IMyInterface<>而不提供類型參數。如果你想這樣做,因爲你的問題暗示,執行類型也必須是通用的:

<component service="Namespace.IMyInterface`1, AssemblyName" 
     type="Namespace.MyGenericClass`1, AssemblyName" /> 

注意,您可以兩個組件註冊。如果你這樣做,解決IMyInterface<string>會得到MyClass的一個實例,而解析IMyInterface<AnyOtherType>會給你一個MyGenericClass<AnyOtherType>的實例。

+0

我剛剛重新嘗試過,並得到它的工作。我曾用'1表示法來嘗試它,正如你所說的,如果實現類型不是通用的,那麼你會得到一個錯誤。我也嘗試了上面的第一個例子,但是我沒有指定泛型類型的組件名稱(在本例中爲mscorlib)。添加這個解決了這個問題謝謝.. – Rob 2011-06-01 09:19:38