0

我正在做一个基于多层架构的项目,即持久层(数据库系统)、服务器层(与数据库通信、执行耗时任务等)和客户端层(演示、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
4

1 回答 1

0

MVVM 应该命名为 MVMV(Model ViewModel View)。但我认为原因是 MVVM 看起来更好。

一种方法是:

  • 将您的 DTO 发送给模型,或者,如果您愿意,DTO 就是您的模型。在这里,您的 DTO 可以深度嵌套,随心所欲。您的模型没有任何行为。
  • 在 ViewModel 中展平模型。行为驻留于此。但是您正在使用模型中的数据。
  • 这使您的 View 可以轻松地展示您的 ViewModel。
于 2014-04-21T11:12:47.300 回答