我有一個場景,我想在容器中註冊一個組件的單個實例,但不幸的是它不能在應用程序啓動時創建。 該組件只能被實例化,傳遞一些對象,這些對象僅在應用程序生命週期中稍後提供(但它們不是其他IoC註冊服務,但是)[請參見下面的註釋]。在初始配置後在IoC容器中註冊
- 處於IoC容器註冊部件後的初始配置(在應用程序啓動時運行)一種不好的做法?
- 如何在不直接引用容器的情況下完成它?我應該抽象一個註冊服務嗎?
- 有更好的方法來支持這種情況?
注:關於實際情況
我想放在容器與UI控件的特定實例初始化成分(這基本上是一個適配器),所以我不得不手動創建組件實例並將其註冊到容器中。
我會在應用程序啓動時做到這一點,但不幸的是我沒有可用的UI控件實例(我也不能自己創建它)。
即使在以後,我也無法從其他組件的表面到達UI控件實例,而不知道它們的具體類。
因此,我認爲我可以將適配器註冊的責任放入擁有UI控件的類中。
我的初步方案:
public interface IDockManager { ... }
public class AcmeDockManagerAdapter : IDockManager {
public AcmeDockManager(DockControl control) { ... }
...
}
public class ShellViewModel { ... }
public class ShellView : Window {
internal DockControl theDockControl;
}
public class AnotherViewModel {
AnotherViewModel(IDockManager dockManager) { ... }
}
我unconfortable與解決方案:
public class ShellView : Window {
internal DockControl theDockControl;
public ShellView() {
InitializeComponents();
var dockManager = new AcmeDockManagerAdapter(theDockControl);
//registration in the container
}
}
這是一個非常優雅的解決方案。然而,我的問題與組件實例的成本無關,而是與某些構造器參數的可用性有關。推遲實際的實例化要求至少懶惰的包裝器知道如何檢索所需的參數,當它最終到達創建實例時。 我應該更詳細地解釋我的情況,也許(我將要這樣做)。謝謝你的幫助。 – 2010-12-18 09:29:01
對不起,但問題與視圖和虛擬機之間的連線沒有關係(這已經到位)。我只是添加了實際的類,希望能夠澄清上下文。 我的意圖是抽象對接部分並將其接口從ShellVM中分離出來,確切目的是允許動態添加。 我希望將對接服務放在容器中以簡化依賴注入,但我可以肯定從ShellVM(它已經在容器中註冊爲單例)訪問它。 – 2010-12-18 19:27:19