有些时候,回归基本原则并保持简单(亲吻)往往会奏效。
在这种情况下,我想到的是
The Explicit Dependency Principle
和
Pure Dependency Injection
。
这个
MainViewModel
通过注入容器(big no no)或具有多个依赖项(代码气味),显然做得太多了。试着缩小班级应该做什么(SRP)
因此,假设主视图模型需要一组窗格。那为什么不满足它的需要呢。
public class MainViewModel : ViewModelBase {
public ObservableCollection<DockPaneViewModel> DockPanes { get; set; }
//Give the view model only what it needs
public MainViewModel(IEnumerable<DockPaneViewModel> panes) {
DockPanes = new ObservableCollection<DockPaneViewModel>(panes);
}
public void ResetPanes() {
foreach (var pane in DockPanes) {
pane.Reset();
}
//notify view
}
}
注意基板的细微变化
public abstract class DockPaneViewModel : ViewModelBase {
// ...
public virtual void Reset() {
//...
}
}
主视图模型不应该关心如何创建依赖关系。它只关心得到它明确要求的东西。
这同样适用于不同的窗格实现。
如果视图模型需要能够创建多个子对象,则将该职责委托给工厂。
public class MonitorPageViewModel : DockPaneViewModel {
public MonitorPageViewModel(ILogger logger, IRepository<RawMessage> repository,
IRepository<Parser> parserRepository, IParsingService parsingService,
IPaneFactory factory) {
// ...
}
public void CreateDashboard() {
var dashBoardVm = factory.Create<MonitorDashboardViewModel>();
//...
}
}
同样,主体应尽可能少地承担责任。
View First或ViewModel First被视为实现问题,如果遵循配置模型的约定,则实际上并不重要。
如果设计做得很好,那么无论您使用的是框架还是纯代码都无关紧要。
然而,当涉及到将所有内容组合在一起时,这些框架确实派上了用场。最简单、最优雅的解决方案是让一些东西创建对象图,但如果没有这些东西,您只能自己在合成根中构建它。