使用DTO和MVVM模式(caliburn micro)的最佳方法是什么?

时间:2013-11-13 00:35:42

标签: .net mvvm architecture caliburn.micro dto

我正在开发一个基于多层体系结构的项目,即持久层(数据库系统),服务器层(与数据库通信,执行耗时的任务等)和客户端层(表示,CRUD等) )。

该架构(几乎)非常普遍和简单。我使用MVVM(Caliburn micro)进行演示,使用DTO在服务器应用程序和客户端应用程序之间传输数据。

我认为MVVM模式的一个常用方法是将DTO对象传输(或以某种方式吸收)到ViewModel对象(负责数据的呈现方式),因为我们希望将传输对象与表示对象分开(以避免向传输对象添加演示行为)。

我认为这种方法是正确的,但我对此有一些想法:

  • 我可能想要不时重复使用对象的呈现方式
  • 我有点感觉这种方法并不完全可以使用单一责任原则 - 在caliburn中的视图模型处理视图的行为(比如对用户操作做出反应等),因此向其添加数据保持/操作责任在我看来看起来不太好看
  • 我也认为在不同的类中使用这两个可以改善项目结构和代码可读性

因此,我创建了另一组类(称为ViewHelpers),它们保存数据,呈现方式(注释如DisplayName等)以及从DTO行为导入/导出。我用接口连接它们,因为它们具有几乎相同的行为(导入,导出等),我想使用泛型继承(如EditViewModel等)来概括一些ViewModel,以保持类似ViewModel的结构一致

我还应该注意到我正在使用Model类与服务器服务进行通信(获取和保存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

1 个答案:

答案 0 :(得分:0)

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

一种方法是:

  • 将您的DTO发送到模型,或者,如果您愿意,DTO是您的模型。在这里你的DTO可以深深嵌套,你想要什么。您的模型没有任何行为。
  • 在ViewModel中展平模型。行为就在这里。但是您正在使用模型中的数据。
  • 允许您的View轻松展示您的ViewModel。