2009-09-17 112 views
2

我正在使用Unity DI容器。在配置文件我指定以下類型:Unity容器配置問題

<type type="Interfaces.ILogger,Interfaces" 
mapTo = "ConcreateClasses.ConsoleLogger,ConcreateClasses" /> 

我的理解是,無論是接口的dll和ConcreteClasses DLL應該在我的項目中引用爲了這個工作。

但我想要做的不是在設計時引用具體的實現類。我希望它們在運行時通過指定ConcreteClasses dll的路徑加載。

有沒有辦法做到這一點?

感謝

回答

1

你可以通過反射做:

Assembly a = Assembly.LoadFrom("pathToDll"); 
Type interfaceType = typeof(Interfaces.ILogger); 
Type implementingType = a.GetTypes.Where(t => t.IsAssignableTo(interfaceType)).First(); //add any other constraints to decide mapping 

container.RegisterType(interfaceType, implementingType); 
+0

感謝您的回答。那麼沒有辦法通過配置文件來做到這一點? – rauts 2009-09-17 15:27:13

3

你並不需要參考的具體實施裝配在你的項目,你只需要有它在同一個文件夾作爲配置文件,或可從GAC獲得。

這是便利引用帶有具體實現的其他程序集,以便Visual Studio將在您的項目的結果BIN文件夾中放置一個DLL的副本,從而使查找瑣碎。

+0

我很抱歉,具體的實現程序集可以是參考或GAC中的。將它放在與配置文件相同的文件夾中不起作用。無論如何感謝您的答案 – rauts 2009-09-17 16:21:21

+0

我現在有一個相當大的實現坐在EC2上,沒有對具體對象的引用,並且我的所有對象都在Unity配置部分中按類型引用。 我不知道你有什麼問題,但這個配置適合我。 – 2009-09-17 16:35:49

+0

這很有趣。你是否將所有的配置文件和Dll部署在同一個文件夾中,因爲那是我現在正在做的事情,而且它不工作。您能否與我分享您的部署策略? – rauts 2009-09-18 10:28:41