我一直在尋找另外一個問題:使用Unity來加載網頁API插件提供商
大家都罵,要求「做錯了」這個問題的人。但是如果你看看描述這個的所有例子和站點,他們都描述了通過構造函數向Controller中注入接口。
這裏的問題是,假設我有一個網頁API,其中,例如在不同的語言返回一個短語:
http://mywebapi/api/SayHello/FR
的FR告訴我們要在您好法語的WebAPI。我可以輕鬆地使用英文,中文或任何其他語言。
現在,我決定建立一套程序集,每種語言一個,全部實現一個稱爲ILanguage的接口。我創建一個Unity容器,在配置文件中放置命名的類型映射(用「FR」解析ILanguage接口將返回由法國程序集實現的ILanguage等)。
代碼不知道什麼時候調用它將實現的WHICH實現。將一個ILanguage實現注入到Controller構造函數中似乎是錯誤的。只有當URL被解析,我們進入的方法做,我們看到了「FR」參數傳遞的,這告訴我們打電話:
container.Resolve<ILanguage>("FR")
,以獲得正確的ILanguage接口調用返回相應的短語。
在你的代碼中,教條式的「永遠不會調用container.Resolve」聽起來很好,純粹,但它不能解決這個問題。那麼,推薦的方法是什麼?它看起來很像ServiceLocator,因爲我們想要使用某種「鍵」動態地查找服務,但我當然不希望我的Web API控制器程序集直接瞭解所有這些小語言程序集。我已經在使用上述系統工作了,但我想知道所有DI/IoC純粹主義者會對此代碼發表什麼意見,如果他們不喜歡它,他們如何解決Web中的「動態插件」問題API控制器。
我要去花點時間思考這個,我會寫另一條評論。謝謝! – 2014-09-23 18:12:22