更改基本MVVM的当前实现以遵守SOLID模式

我一直在编写所有MVVM应用程序,其基本设计模式通常在网上提供的MVVM示例中提到。 我所遵循的模式描述如下:

模型

本节包括DTO类及其属性和Interfaces IDataService等:

public class Employee { public string EmployeeName { get; set; } public string EmployeeDesignation { get; set; } public string EmployeeID { get; set; } } public interface IDataService { public Task GetEmployeeLst(); } 

代理

该层包含实现IDataservice的Dataservice调用,如:

 public class DataService : IDataService { public async Task GetEmployeeLst() { // Logic to get employee data from HTTPClient call } } 

视图模型

该层包含ViewModel以及对从中接收所有数据的Model和Proxy层的引用:

 public class BaseViewModel { public BaseViewModel(INavigationService nav, IDataService data, IAESEnDecrypt encrypt, IGeoLocationService geoLocation, IMessageBus msgBus, ISmartDispatcher smtDispatcher) { } // This also include common methods and static properties that are shared among most of the ViewModels } 

所有ViewModel都inheritanceBaseViewModel。 每个viewModel还包含Delegatecommand,它在UI触发事件时执行。 然后,它通过调用代理层中的DataService从服务器获取数据并执行业务逻辑并在ViewModel中填充绑定到视图的属性。 对于每个View,都有一个绑定到View的Datacontext的VM。 ViewModel还负责启动动画我使用触发器来启动故事板,该故事板绑定到我在VM中的枚举,用于更改这些触发器的状态,如下所示: http : //www.markermetro.com/2011/05/technical/ MVVM友好的可视状态管理,与窗口电话-7 /

视图

在这一层中,我拥有所有的视图,用户控件和业务逻辑,并实现了某些依赖关系,如GeoLocation Service,AES加密,Views之间的NavigationService等。

每个View都有.xaml和.xaml.cs文件。 在.xaml.cs文件中,我用VM绑定了视图的数据上下文,如下所示:

 this.DataContext = App.IOConatiner.GetInstance(); 

并且从这里开始所有绑定。

我的问题是,最近我知道这个模式没有遵循我在我的问题的答案中得知的SOLID设计模式: Simple Injector在BaseClass中注入多个依赖项

我正在努力根据前一个问题的答案给出的建议改变我的设计。 但我无法得到一些像:

  1. 目前,View Datacontext绑定到ViewModel,因此所有控件都由VM中的属性控制。 如何使用Processor / Service或DialogHandler将其更改为上述模式?

  2. 我正在使用Delegatecommands绑定到UI元素的命令属性。 执行这些命令会发生某些动作,就像动画一样,会显示usercontrol。 如何在命令模式中执行此操作?

  3. 如何以最佳方法开始更改当前实施以适应所有这些更改?

首先回答你的问题3

如何以最佳方法开始更改当前实施以适应所有这些更改?

这是您需要采取的第一步。 这不是对您当前代码进行一些智能重构的情况。 您需要退后一步并设计应用程序。 我曾经读过一些关于(重新)设计的好博客 。

在开始编写任何代码之前,请定义要向用户显示的不同基本类型的视图数量? 例如:

  1. 只显示(任何类型)数据
  2. 编辑数据
  3. 提醒用户
  4. 询问用户输入

定义不同的需求时,可以将其转换为为其服务的工作量身定制的特定接口。 例如,允许用户编辑数据的视图通常具有如下界面:

 public interface IEditViewModel { public EditResult EditEntity(TEntity entityToEdit)(); } 

完成此设计的每个细节后,您必须决定如何向用户显示您的视图。 我使用另一个接口来为我处理这个任务。 但您也可以决定让导航服务处理这种任务。

有了这个框架,您就可以开始编写实现代码了。

目前,View Datacontext绑定到ViewModel,因此所有控件都由VM中的属性控制。 如何使用Processor / Service或DialogHandler将其更改为上述模式?

这不会改变这种设计。 您仍然会将视图绑定到viewmodel并将datacontext设置为viewmodel。 有了很多视图,使用像Caliburn Micro这样的MVVM框架会派上用场。 基于Convention over Configuration ,这将为您完成很多MVVM。 从这个模型开始,会使学习曲线更高,所以我的建议是手工开始。 您将学习这种MVVM工具的内容。

我正在使用Delegatecommands绑定到UI元素的命令属性。 执行这些命令会发生某些动作,就像动画一样,会显示usercontrol。 如何在命令模式中执行此操作?

我不确定你在这里提到的命令模式是否是我在上一个答案中建议你的命令模式 。 如果是这样,我认为你需要重读这个博客,因为这与我认为你在这个问题中的命令完全无关。

动画和那种东西是视图的责任,而不是视图模型。 所以视图应该处理所有这些东西。 XAML有很多方法可以解决这个问题。 我可以在这里解释一下。 一些想法: 触发器 , 依赖属性

另一个选择:代码背后! 如果逻辑纯粹是与视图相关的IMO,将此代码放在视图后面的代码中并不是致命的罪。 只是不要想做一些灰色区域的东西!

对于只在viewmodel中执行方法调用的命令,仍然可以使用ICommand,而像Caliburn这样的MVVM工具会自动执行此操作…

而且:松散基类……

如果viewmodel基类本身没有使用这些服务,为什么要在viewmodel基类中注入所有这些服务?

只需在需要这些服务的派生视图模型中注入所需的服务。