我有几个经过彻底的单元测试和精心制作的富DDD模型类,带有最终的不可变不变量和完整性检查。对象的实例化是通过适当的构造函数、静态工厂方法,甚至通过生成器来实现的。
现在,我必须提供一个Spring MVC表单来创建一些类的新实例。
在我看来(我不是专家),我必须为我想要绑定的所有表单的支持类提供空的构造函数和属性的设置器。
那么,我该怎么做呢?
创建专门用于形成支持的贫血对象,并将信息传输到我的域模型( DRY原则...)调用适当的方法/构建器?
或者有没有我错过的机制可以拯救我的一天?:)
提前感谢您的智慧!
发布于 2011-10-14 05:15:04
用于与表示层绑定的对象通常称为视图模型,它们是用于显示从域对象映射的数据,然后将用户输入映射回域对象的DTOs。视图模型通常看起来与它们所表示的域对象非常相似,但是有一些重要的区别:
来自域对象的
视图模型似乎违反了DRY原则,但是仔细观察后,视图模型的职责是不同的,因此在考虑到single responsibility principle的情况下,最好有两个类。另外,请看this的文章,文章讨论了DRY原则经常导致的重用的谬误。
此外,视图模型确实是贫血的,尽管它们可能有一个接受域对象作为参数的构造函数,以及一个使用视图模型中的值作为输入来创建和更新域对象的方法。根据我的经验,我发现为表示层将要呈现的每个域实体创建一个视图模型类是一个很好的实践。管理域对象和视图模型的双重类层次结构比管理复杂的映射机制更容易。
还要注意,有一些库试图简化视图模型和域对象之间的映射,例如.NET框架的AutoMapper。
发布于 2011-10-13 21:22:13
是的,您需要为表单创建对象以接受所有输入,并在一次操作中使用此对象更新您的模型。
但我不会将此对象称为贫血(尤其是如果您使用DDD)。这些对象代表一个工作单元。所以这也是领域概念!
发布于 2013-09-20 02:14:20
我通过创建DTO接口解决了这个问题:
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注解。
https://stackoverflow.com/questions/7754702
复制相似问题