我目前正在製作一個WinForms系統(我知道)在創建表單時有很多Constructor Injection
,但如果這些表單/視圖需要打開另一個表單,我發現DI容器也被注入了,所以我們可以在運行時查找所需視圖界面的實現。例如如何避免服務定位符模式?我是不是該?
public partial class MyView : Form, IMyView
{
private readonly IDIContainer _container;
public MyView(IDIContainer container)
{
InitializeComponent();
_container = container;
}
public OpenDialogClick(object sender, EventArgs e)
{
var dialog = container.Resolve<IDialogView>();
dialog.ShowDialog(this);
}
}
我知道這基本上是使用容器作爲服務定位器。我一再被告知這被認爲是反模式,所以我想避免這種用法。
我大概可以注入視圖這樣構造的一部分:
public partial class MyView : Form, IMyView
{
private readonly IDialogView _dialog;
public MyView(IDialogView dialog)
{
InitializeComponent();
_dialog = dialog;
}
public OpenDialogClick(object sender, EventArgs e)
{
dialog.ShowDialog(this);
}
}
但如果對話視圖是實例相當昂貴呢?
有人建議我們創建一種內部使用DI容器的表單工廠,但對我來說,這看起來像是簡單地創建另一個服務定位器的包裝。
我知道,在某些時候,東西必須知道如何創建一個IDialogView,所以我想,要麼當複合根目錄中創建(可能不理想,如果有多種形式,它的解決,一些或所有創建都很昂貴),或者複合根本身有解決依賴關係的方法。在這種情況下,組合根必須具有類似於服務定位器的依賴關係?但那麼孩子的形式如何創建這樣的對話框呢?他們會通過事件來調用複合對象來打開這樣的對話框嗎?
我一直遇到的一個特殊問題是容器幾乎不可能輕易地模擬。這部分是讓我思考形式工廠的想法,儘管它只是一個包裝容器的包裝。這是一個明智的理由嗎?
我是不是覺得自己陷入了困境?有沒有簡單的方法通過這個?或者我只是剪了結,找到適合我的東西?
不幸的是,您的網站因爲「惡意軟件的惡名」而被我的組織阻止:( – adhocgeek
有趣的是,博客如何可能產生「惡意軟件的惡名」?這絕對是您組織方面的一些東西。 –
這絕對是我的公司防火牆,有趣的是,它似乎現在加載......也許這是與您的網站上的廣告有關嗎? – adhocgeek