7

让我们假设一个简单的 Spring MVC 控制器接收域对象的 ID。控制器应该调用一个应该对该域对象做某事的服务。

您在哪里通过从数据库加载域对象的 ID 将其“转换”为域对象?这不应该由控制器完成。因此服务方法接口必须使用接受域对象的ID不是域对象本身。但是如果服务的接口将域对象作为参数,它会更好。

您对这个常见用例有何看法?你如何解决这个问题?

4

3 回答 3

4

控制器应该将 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();
}
于 2009-07-03T15:20:44.920 回答
2

在我的一个项目中,我使用了服务层:

class ProductService {

    void removeById(long id);

}
于 2009-07-03T15:07:03.190 回答
2

我认为这取决于服务是远程的还是本地的。作为一项规则,我尽量将 ID 传递给远程服务,但更喜欢本地服务的对象。

这背后的原因是,它通过仅向远程服务发送绝对必要的内容来减少网络流量,并防止多次调用本地服务的 DAO(尽管使用 Hibernate 缓存,这可能是本地服务的静音点)。

于 2009-07-03T15:12:08.280 回答