第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 Collection 中創(chuàng)建新對(duì)象時(shí)使用 DI 的正確方法

在 Collection 中創(chuàng)建新對(duì)象時(shí)使用 DI 的正確方法

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

1 回答

?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

通常,當(dāng)我讀到 DI 時(shí),它被視為全部和全部。即使在我的小而簡(jiǎn)單的項(xiàng)目中,我也經(jīng)常大量使用 IoC,但是,它只是一種模式,并且和其他所有東西一樣都有一席之地。


Microsoft Press 的Adaptive Code via C#書(shū)很好地解釋了 SOLID,證明了其使用的合理性,涵蓋了 DI 的各種形式以及每種技術(shù)的成本/收益。對(duì)我來(lái)說(shuō),它對(duì)這些問(wèn)題、管理項(xiàng)目增長(zhǎng)和處理外部依賴(lài)關(guān)系有很大的意義。


除了抽象和分解引導(dǎo)/模塊化過(guò)程的系統(tǒng)之外,我不會(huì)將其傳遞UnityContainer給我的引導(dǎo)程序之外的任何東西。除了您對(duì)此提出的觀點(diǎn)之外,Unity 是您的應(yīng)用程序的第三方依賴(lài)項(xiàng),就像其他任何東西一樣,我會(huì)非常有選擇地選擇我將自己綁定到哪個(gè)(如果有的話)。


對(duì)于上面的示例,我將使用一個(gè)簡(jiǎn)單的工廠。您可以隨意抽象它,但一個(gè)好的折衷方案是減輕您的主要 ViewModel 必須創(chuàng)建自己的孩子的負(fù)擔(dān)。


使用 DI 時(shí),在適當(dāng)?shù)牡胤阶约簩?shí)例化事物并沒(méi)有錯(cuò)。最合適的地方當(dāng)然是工廠。正如您所說(shuō),我不會(huì)創(chuàng)建通用工廠,這基本上就像傳遞 IoC 容器一樣。而是定義一個(gè)類(lèi)型化工廠:


public interface IWorkspaceItemViewModelFactory

{

    WorkspaceItemViewModel CreateWorkspaceItem();

}

這個(gè)的實(shí)現(xiàn)可能看起來(lái)像這樣:


public class WorkspaceItemViewModelFactory

{

    private readonly IWorkspaceManager _workspaceManager;


    public WorkspaceItemViewModelFactory(IWorkspaceManager workspaceManager)

    {

        _workspaceManager = workspaceManager;

    }


    public WorkspaceItemViewModel CreateWorkspaceItem()

    {

        return new WorkspaceItemViewModel(_workspaceManager);

    }

}

此類(lèi)是信息專(zhuān)家,僅負(fù)責(zé)創(chuàng)建WorkspaceItemViewModel實(shí)例。它具有使用new關(guān)鍵字的權(quán)利,并且具有WorkspaceItemViewModel依賴(lài)關(guān)系的知識(shí)。您可能希望使用接口隔離 ViewModel,但在您的用例中價(jià)值可能很小。歸根結(jié)底,您使用 IoC、DI 和接口隔離是有原因的,當(dāng)它們停止為您的特定應(yīng)用程序提供價(jià)值時(shí),它們的使用就會(huì)變成噪音。


您的視圖模型可以使用以下內(nèi)容:


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>();

}


查看完整回答
反對(duì) 回復(fù) 2022-01-16
  • 1 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)