亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Collection 中創建新對象時使用 DI 的正確方法

在 Collection 中創建新對象時使用 DI 的正確方法

C#
哈士奇WWW 2022-01-16 16:19:04
MVVM,使用 PRISM 6 和 Unity。Bootstrapper 負責創建初始視圖,該視圖又自動連接到 ViewModel(即,視圖模型被解析并且它的 DI 被處理)?,F在視圖模型有一個其他視圖模型的集合。這個集合可以通過用戶輸入添加到,比如按下按鈕。集合中的視圖模型需要訪問我必須管理“工作區”(圖像文件夾等的路徑)的單例。所以我還希望這些對象的創建能夠將“工作區”單例注入其中。在創建新 ViewModel 的方法中,使用 DI/IoC 創建它的正確方法是什么?我看到它的唯一方式(危險地說“只有”我知道,這就是我尋求幫助的原因)是:將 Unity Container 注入到包含集合的視圖模型中,然后在按下按鈕時解析新的視圖模型。新的視圖模型將設置為依賴于“工作區”對象的接口。當按鈕被點擊時創建一個new視圖模型并將“工作區”傳遞給構造函數(當然工作區需要被 DI 到父視圖模型中才能傳遞下來)。我已經閱讀了多個通過 DI 將容器向下傳遞的地方,以便可以使用 Resolve<> 不是“正確的”。這是創建通用工廠有幫助的地方嗎?這仍然迫使我將容器向下傳遞,但現在它只是以工廠的形式......public T factory<T>(IContainer _container){    return _container.Resolve<T>();}
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

通常,當我讀到 DI 時,它被視為全部和全部。即使在我的小而簡單的項目中,我也經常大量使用 IoC,但是,它只是一種模式,并且和其他所有東西一樣都有一席之地。


Microsoft Press 的Adaptive Code via C#書很好地解釋了 SOLID,證明了其使用的合理性,涵蓋了 DI 的各種形式以及每種技術的成本/收益。對我來說,它對這些問題、管理項目增長和處理外部依賴關系有很大的意義。


除了抽象和分解引導/模塊化過程的系統之外,我不會將其傳遞UnityContainer給我的引導程序之外的任何東西。除了您對此提出的觀點之外,Unity 是您的應用程序的第三方依賴項,就像其他任何東西一樣,我會非常有選擇地選擇我將自己綁定到哪個(如果有的話)。


對于上面的示例,我將使用一個簡單的工廠。您可以隨意抽象它,但一個好的折衷方案是減輕您的主要 ViewModel 必須創建自己的孩子的負擔。


使用 DI 時,在適當的地方自己實例化事物并沒有錯。最合適的地方當然是工廠。正如您所說,我不會創建通用工廠,這基本上就像傳遞 IoC 容器一樣。而是定義一個類型化工廠:


public interface IWorkspaceItemViewModelFactory

{

    WorkspaceItemViewModel CreateWorkspaceItem();

}

這個的實現可能看起來像這樣:


public class WorkspaceItemViewModelFactory

{

    private readonly IWorkspaceManager _workspaceManager;


    public WorkspaceItemViewModelFactory(IWorkspaceManager workspaceManager)

    {

        _workspaceManager = workspaceManager;

    }


    public WorkspaceItemViewModel CreateWorkspaceItem()

    {

        return new WorkspaceItemViewModel(_workspaceManager);

    }

}

此類是信息專家,僅負責創建WorkspaceItemViewModel實例。它具有使用new關鍵字的權利,并且具有WorkspaceItemViewModel依賴關系的知識。您可能希望使用接口隔離 ViewModel,但在您的用例中價值可能很小。歸根結底,您使用 IoC、DI 和接口隔離是有原因的,當它們停止為您的特定應用程序提供價值時,它們的使用就會變成噪音。


您的視圖模型可以使用以下內容:


public class ExampleViewModel : ViewModelBase

{

    public ExampleViewModel(IWorkspaceItemViewModelFactory workspaceItemViewModelFactory)

    {

        AddItemCommand = new ActionCommand(() =>

        {

            var newItem = workspaceItemViewModelFactory.CreateWorkspaceItem();

            WorkspaceItems.Add(newItem);

        });

    }


    public ICommand AddItemCommand { get; }


    public ObservableCollection<WorkspaceItemViewModel> WorkspaceItems { get; } = new ObservableCollection<WorkspaceItemViewModel>();

}


查看完整回答
反對 回復 2022-01-16
  • 1 回答
  • 0 關注
  • 198 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號