首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring MVC 3-将“不可变”对象绑定到表单

Spring MVC 3-将“不可变”对象绑定到表单
EN

Stack Overflow用户
提问于 2011-10-13 21:16:35
回答 3查看 2K关注 0票数 7

我有几个经过彻底的单元测试和精心制作的富DDD模型类,带有最终的不可变不变量和完整性检查。对象的实例化是通过适当的构造函数、静态工厂方法,甚至通过生成器来实现的。

现在,我必须提供一个Spring MVC表单来创建一些类的新实例。

在我看来(我不是专家),我必须为我想要绑定的所有表单的支持类提供空的构造函数和属性的设置器。

那么,我该怎么做呢?

创建专门用于形成支持的贫血对象,并将信息传输到我的域模型( DRY原则...)调用适当的方法/构建器?

或者有没有我错过的机制可以拯救我的一天?:)

提前感谢您的智慧!

EN

回答 3

Stack Overflow用户

发布于 2011-10-14 05:15:04

用于与表示层绑定的对象通常称为视图模型,它们是用于显示从域对象映射的数据,然后将用户输入映射回域对象的DTOs。视图模型通常看起来与它们所表示的域对象非常相似,但是有一些重要的区别:

来自域对象的

  1. 数据可以被展平或以其他方式转换,以适合给定视图的要求。与MVC等表示框架中的映射相比,将映射放在纯对象中更容易管理。更容易调试和检测错误。
  2. 给定的视图可能需要来自多个域对象的数据-可能不存在满足视图要求的单个域对象。视图模型可以由多个域对象填充。
  3. 视图模型通常在设计时考虑到特定的表示框架,因此可以利用框架特定的属性进行绑定和客户端验证。正如您所说的,一个典型的需求是一个无参数的构造函数,这对于视图模型来说很好。同样,测试和管理视图模型要比某种复杂的映射机制容易得多。

视图模型似乎违反了DRY原则,但是仔细观察后,视图模型的职责是不同的,因此在考虑到single responsibility principle的情况下,最好有两个类。另外,请看this的文章,文章讨论了DRY原则经常导致的重用的谬误。

此外,视图模型确实是贫血的,尽管它们可能有一个接受域对象作为参数的构造函数,以及一个使用视图模型中的值作为输入来创建和更新域对象的方法。根据我的经验,我发现为表示层将要呈现的每个域实体创建一个视图模型类是一个很好的实践。管理域对象和视图模型的双重类层次结构比管理复杂的映射机制更容易。

还要注意,有一些库试图简化视图模型和域对象之间的映射,例如.NET框架的AutoMapper

票数 10
EN

Stack Overflow用户

发布于 2011-10-13 21:22:13

是的,您需要为表单创建对象以接受所有输入,并在一次操作中使用此对象更新您的模型。

但我不会将此对象称为贫血(尤其是如果您使用DDD)。这些对象代表一个工作单元。所以这也是领域概念!

票数 0
EN

Stack Overflow用户

发布于 2013-09-20 02:14:20

我通过创建DTO接口解决了这个问题:

代码语言:javascript
复制
public interface DTO<T> {
    T getDomainObject();

    void loadFromDomainObject(T domainObject);
}

public class PersonDTO implements DTO<Person> {
    private String firstName;
    private String lastName;

    public PersonDTO() {
        super();
    }

    // setters, getters ...

    @Override
    public Person getDomainObject() {
        return new Person(firstName, lastName);
    }

    @Override
    public void loadFromDomainObject(Person person) {
        this.firstName = person.getFirstName();
        this.lastName = person.getLastName();
    }

    // validation methods, view formatting methods, etc
}

这还可以防止视图验证和格式化内容泄漏到域模型中。我真的不喜欢在我的域对象中有Spring相关的(或其他框架相关的)注解(@Value等)和javax.validation注解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7754702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档