我正在做一个基于多层架构的项目,即持久层(数据库系统)、服务器层(与数据库通信、执行耗时任务等)和客户端层(演示、CRUD 等)。
该架构(几乎)非常常见且简单。我使用 MVVM (Caliburn micro) 进行演示,使用 DTO 在服务器应用程序和客户端应用程序之间传输数据。
我认为这里 MVVM 模式的一种常用方法是将 DTO 对象转移(或以某种方式吸收)到 ViewModel 对象(负责数据的呈现方式),因为我们希望将传输对象与呈现对象分开(以避免添加表示行为以传输对象)。
我相信这种方法是正确的,但是我对此有一些想法:
- 我可能想不时重复使用对象的呈现方式
- 我有一点感觉,这种方法对于单一责任原则并不完全可行 - caliburn micro 中的视图模型处理视图的行为(如对用户操作做出反应等),因此向其添加数据持有/操作责任看起来并不在我看来很好
- 我还认为将这两个放在不同的类中可以提高项目结构和代码可读性
因此,我创建了另一组类(称为 ViewHelpers),它们保存数据、数据的呈现方式(如 DisplayName 等注释)以及从 DTO 行为导入/导出。我将它们与接口连接起来,因为它们具有几乎相同的行为(导入、导出等),并且我想使用通用继承(如 EditViewModel 等)概括一些 ViewModel,以保持相似 ViewModel 的结构一致
我还应该注意,我正在使用模型类与服务器服务进行通信(获取和保存 dto 对象的方法)。
这是解决这类问题的好方法吗?我错过了什么吗?我是否误解了 MVVM 模式,将 MVVM 的模型称为 ViewHelper,并给我的模型错误的行为?
谢谢你的建议。由于我的方法仅通过描述可能并不完全清楚,因此让我提供一个简短的伪代码示例。
public interface IViewHelperOperations<T> //T is DTO object
{
T Export();
void Import(T item);
}
public interface IModelOperations<T> //T is DTO object again
{
T GetDTO();
void SaveDTO(T item);
//connecting with server service to save or get objects from database
}
public abstract class AGenericEditModel<T> //T is DTO again
{
//data is binded to viewhelper object
protected IModelOperations<T> model;
protected IViewHelperOperations<T> viewHelper;
public virtual SaveItem()
{
model.SaveDTO(viewHelper.Export());
}
}
//i think that implementation of those is pretty obvious