模型解析器应该在MVC中使用哪个层

时间:2013-05-05 13:57:02

标签: design-patterns model-view-controller model controller

假设正在使用MVC设计模式,并且使用的web framework不支持从HTTP请求(JSON或XML数据)解析模型。需要将传入的转储请求数据解析为模型对象。现在,我们需要开发model resolver

我知道只有HTTP处理view layer个请求并在Service(Controller) layer中执行所有商务工作才是MVC的正确方法。根据这个假设,在View层中进行模型解析操作并不是一个好主意。它应该在服务层中定义。 (我错了吗?)。但是很多Web框架在视图层中处理它。问题是,什么是不打破MVC design pattern和为什么?

的最好方法

谢谢!

编辑:

我想更具体地说明在框架中进行模型解析的问题;

假设客户端询问“添加用户”。

1。)它通过HTTP发送用户数据并假设它是JSON

2.。)您的视图层正在处理它,将用户JSON数据解析为您的用户模型对象(模型解析器)并将用户发送到服务层(此处控制器层开始工作)

3.。)您的服务层验证用户。(验证电子邮件,用户名等)。它在这里完成,因为它是一个商业工作,它发送给用户模型层以保持。

4.。您的模型层存储用户。

在视图层中完成的此模型解析在webframeworks中最常见,如2所示。

1 个答案:

答案 0 :(得分:0)

从我的主观观点来看,我没有看到设计有任何问题或是否违反了SRP。如果不需要逻辑,则可以在任何层中处理转换。但是,如果您坚持认为如果转换必须保留在服务层中,那么您也可以这样做。但让我解释为什么不需要它。例如(在C#中),您有一个转换器(或解析器):

public class UserModelConverter{
    public UserModel FromJSON(string json){
        // parse the JSON and return the class
    }
}

现在您在服务层拥有解析器,现在您可以为用户使用统一的JSON格式。但是,请考虑一些情况:

  1. 假设UserModel有一个LastName字段。该字段不是必需的,因此它可以为null。但是,您需要某些视图的特定默认值(例如,在“显示用户”屏幕中,您需要将默认值设置为" [LAST_NAME]",但是string.Empty或" - &#34 ;在其他领域。使用转换器会遇到困难,尤其是JSON格式。

  2. 在特定情况下,您不得不为数据使用不同的JSON格式。示例可以是UserModel数据是屏幕中另一个对象的字段。你怎么能保持它?

  3. 通常,特别是在MVC中,数据通过使用表单发布到控制器,从而生成每个字符串字段。你会在服务层处理对象创建吗?如果没有,那么您将创建逻辑放在不同的层中。

  4. 在某些情况下,解析器适合放入服务层。那可能是:

    1. 部分过程,例如从CSV或XML读取一组记录。
    2. (他们可能更多,我还没有找到情况)
    3. 如果操作不包含特定逻辑(业务逻辑准确),请不要将其放在服务层中。