Spring MVC 领域对象处理最佳实践
Posted
技术标签:
【中文标题】Spring MVC 领域对象处理最佳实践【英文标题】:Spring MVC Domain Object handling Best Practice 【发布时间】:2010-11-07 23:01:59 【问题描述】:让我们假设一个简单的 Spring MVC 控制器接收域对象的 ID。控制器应该调用一个应该对该域对象做某事的服务。
您在哪里通过从数据库中加载域对象的 ID 将其“转换”为域对象?这不应该由控制器完成。所以服务方法接口必须使用接受域对象的ID而不是域对象本身。但是如果服务的接口将域对象作为参数会更好。
您对这个常见用例有何看法?你如何解决这个问题?
【问题讨论】:
【参考方案1】:控制器应该将 id 向下传递到服务层,然后取回渲染其余 HTTP 响应所需的任何内容。
所以——
Map<String,Object> doGet (@RequestParam("id") int id)
return serviceLayer.getStuffByDomainObjectId(id);
其他任何东西都会污染 Web 层,它根本不应该关心持久性。服务层的全部目的是获取领域对象并告诉他们执行业务逻辑。因此,数据库调用应该驻留在服务层中 -
public Map<String,Object> getStuffByDomainObjectId(int id)
DomainObject domainObject = dao.getDomainObjectById(id);
domainObject.businessLogicMethod();
return domainObject.map();
【讨论】:
【参考方案2】:在我的一个项目中,我使用了服务层:
class ProductService
void removeById(long id);
【讨论】:
【参考方案3】:我认为这取决于服务是远程的还是本地的。作为一项规则,我会尽可能将 ID 传递给远程服务,但更喜欢将对象传递给本地服务。
这背后的原因是,它通过仅向远程服务发送绝对必要的内容来减少网络流量,并防止本地服务多次调用 DAO(尽管使用 Hibernate 缓存,这可能是本地服务的静音点)。
【讨论】:
以上是关于Spring MVC 领域对象处理最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
ehcache 或 Spring MVC 的 Spring 缓存中的最佳缓存实践是啥?
JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
确保 AUTHENTICATED 用户被授权访问资源的最佳实践 - Spring mvc、Spring Security、Hibernate