服务返回对象的设计

服务返回对象的设计

服务层的定义

本文中,服务层指暴露给其他进程调用的外部接口的集合。

英文单词含义

service:服务
response:服务返回对象
request:服务请求对象

服务调用模型

在同一个线程内,现代计算机语言一般会提供异常捕获(try-catch)机制,模型如图1 。

在这个模型中,response只需包含业务数据, 异常情况用异常捕获机制处理。

                   -----------------
   request        /                /    response
------------>    /    service     /   ------------->
                /________________/
                         |
                         |
                      throw exception

			图 1

然而,当服务的提供者和消费者不再同一线程,比如远程调用,消费者是无法捕获到服务提供者抛出的异常。
为了能让消费者知道异常情况,response除了包含业务数据外,还应该包含异常情况信息, 模型如图2 。

                   -----------------
   request        /                /       response
------------>    /    service     /   ------------------->
                /________________/
                         |
                         |
                         |  response with exception info
                         -------------------------------->
                        图 2

我推荐的做法是,让response包含两个字段,一个字段指示是否异常, 一个字段承载业务数据(无异常情况下)。

例子(Java)

通用服务返回对象实现

/**
 * 服务返回对象实现
 */
public class ServiceResponse<T extends Serializable> implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 服务返回码     * 这个字段用以指示是否异常。     * 由于“短篇”的限制, 关于对返回码设计的思考,我会写在另一篇文章中。
     */
    private String code;

    /**
     * 业务数据
     */
    private T data;

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }

}

服务接口案例

/**
 * 文章列表服务接口
 */
public interface ArticleListService {
    ServiceResponse<ListArticleData> listArticle(ListArticleRequest request);
}
/**
 * 文章列表服务业务数据
 */
public class ListArticleData implements Serializable {
    private static final long serialVersionUID = 1L;

    // TODO 添加业务字段
}
/**
 * 文章列表服务请求对象
 */
public class ListArticleRequest implements Serializable {
    private static final long serialVersionUID = 1L;

    // TODO 请求参数字段定义
}
时间: 2024-08-29 06:10:57

服务返回对象的设计的相关文章

条款21:必须返回对象时,别妄想返回其reference

条款21:必须返回对象时,别妄想返回其reference 引用只是对象的一种别名当使用引用的时候,请确认他的另一个身份在哪? class Rational { public: Rational(int x, int y) : m_x(x), m_y(y){} //返回const是属于类型保护,friend修饰,以后条款详说 friend const Rational operator + (const Rational &lhs, const Rational &rhs) { Ration

Effective C++:条款21:必须返回对象时别妄想返回其reference

(一) 一定要避免传递一些references去指向其实并不存在的对象. 看下面这个类: class Rational { public: Rational(int numerator = 0, int denominator = 1); private: int n, d; friend const Rational operator*(const Rational& lhs, const Rational& rhs); }; 这个函数不能返回引用, (二)在stack中分配local对

Python快速学习10: 循环的对象及设计 (生活的规律)

前言 系列文章:[传送门] 生活逐渐规律,按时睡觉.今天写博客,明天补时间看会书.慢慢的时间很珍惜 我很喜欢! 时钟就像个循环体,我们将它融入生活. 正文 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标准形式. 灵活的循环方式 (我晚饭后爱上了萨克斯,因为这是生活的一部分.属于我的特殊循环对象,它的按键就像循环方式,然后出来一首美丽的歌曲) 我的萨克斯偶像 循环对象 循环对象是这样一个对象,它包含有一个next()方法(_

一、高复用服务响应对象

一. 高复用服务响应对象 1 package com.mmall.common; 2 3 import com.fasterxml.jackson.annotation.JsonIgnore; 4 import com.fasterxml.jackson.databind.annotation.JsonSerialize; 5 6 import java.io.Serializable; 7 8 /** 9 * 高复用服务响应对象 10 * 11 * Created by ly on 2018/

返回对象的方法总结

//错误! //返回的是local对象,但已被销毁 const string& getDog() { string dog = string( "Budi" ); return dog; } //不推荐,应尽量避免使用new //返回申请在heap上的对象 const string& getDog() { string* dog = new string( "Budi" ); return *dog; } //ok //直接返回对象 [额外开销:经过

PHP get_class 返回对象的类名

get_class (PHP 4, PHP 5) get_class — 返回对象的类名 说明 string get_class ([ object $obj ] ) 返回对象实例 obj 所属类的名字.如果 obj 不是一个对象则返回 FALSE. Note: 在 PHP 扩展库中定义的类返回其原始定义的名字.在 PHP 4 中 get_class() 返回用户定义的类名的小写形式,但是在 PHP 5 中将返回类名定义时的名字,如同扩展库中的类名一样. Note: 自 PHP 5 起,如果在对

HQL查询——查询返回对象类型分析

关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(String hql)方法得到的.我这里要分析HQL的select子句,当然要想深入HQL查询,我们就必须了解hibernate缓存的知识. 一.选择--Select子句查询返回对象的讨论 为什么只说Select子句,因为我们使用的hibernate框架是基于java语言环境下进行开发的,也就是说hibe

Spring MVC返回对象JSON

@RestController 用于返回对象,会自动格式化为JSON @RequestMapping("/user2") public User2 user2(Model model){ model.addAttribute("content", hello + "(第二种)"); User2 user=new User2(); user.setId(1); user.setName("tomas"); user.setPwd

SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法

1.SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.filefilter.FalseFileFilter; import org.slf4j.Logger; import org.s