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>();
}
- 1 回答
- 0 關(guān)注
- 188 瀏覽
添加回答
舉報(bào)