将数据对象结构和字段隐藏到Web服务客户端

时间:2012-12-13 16:16:21

标签: java web-services api design-patterns

我们在Controller / Service / DAO架构上使用Java开发了一个经典的订单管理应用程序。数据对象是表示数据库中数据的POJO。基本上我们有1个类在数据库中映射1个表但我们不使用任何ORM或实体机制这些数据对象在所有层之间传递以通过Web GUI创建/修改/获取订单。 该应用程序还有一个WebService层,允许外部系统通过SOAP管理这些订单。 WebService层依赖于Service层来确保在WebService和GUI之间使用相同的逻辑。

我们尽量使WebServices API尽可能稳定,但由于我们目前正在使用我们的数据对象作为WebService方法的参数,因此API可能会经常更改(至少每次我们拥有或修改任何字段时)数据库)。此外,我们希望将一些复杂的数据库结构隐藏到WebService客户端。例如,数据库包含我们想要从客户端隐藏的多个字段。

具体问题:

  • 通常使用什么样的设计模式来隐藏数据库 结构和字段通过客户端API?

  • 是否有任何良好的做法来处理公众之间的“映射” 方法参数和内部数据对象?

  • 数据传输对象是否是我问题的答案?

3 个答案:

答案 0 :(得分:2)

您不应该跨进程边界传递数据对象。它会使您的应用程序变得脆弱,并且每次进行架构更改时都会保证很多返工。我的建议是:

- 数据访问层应该只是:处理创建,读取,更新和删除数据库对象。 DAL的用户必须知道数据库的工作方式才能使用它。

ex(在伪代码中):

Person = {
PERSON_ID:'1234567jksjgkhsduw0909wueioksgt',
FIRST_NAME:'CHRIS',
LAST_NAME:'MCCALL',
TITLE:'',
GENDER:'M',
LAST_NAME_SUFFIX:null,
Addresses = [{ADDRESS_ID:1234,...}]
}

等 - 服务层转换数据库模式以隐藏复杂性并对试图使用此数据创建应用程序的开发人员真正有用的内容发表意见

例如:

Person = {
name:'Chris McCall',
primary_address:'123 Main St',
secondary_address:null
}

您可以决定是否包含该ID。您可以决定更改字段名称的大小写,并且可以将数据投影到对应用程序开发人员更有意义的表单中,并且比数据库模式更稳定。也许你会留下一堆东西,所以数据越来越少。这样的东西。

您的DBA的任务是创建一个性能良好的数据库,并通过规范化最大化存储。这是与服务层不同的目标,服务层不期望其调用的结果是持久的。

不同的体系结构对于View Model有不同的名称(我称之为)。 DTO是另一个名字。

答案 1 :(得分:0)

  

我们尽量使WebServices API尽可能稳定,但是,作为   我们的数据对象用作WebService方法的参数,   该API可能会经常更改

你已经走错了路。 Web服务是以与平台无关的方式进行的可互操作性和集成 传递给Web服务的所有对象都应该是“数据持有者”,并且应该与业务逻辑无关。您应该有转换器将这些“数据持有者”映射到您的应用程序所需的实际类

答案 2 :(得分:-2)

回答我自己的问题:

我们显然面临将结构化数据暴露给公共API的问题。这些数据来自域模型(数据对象)内部管理,但域模型绝不能直接通过公共API公开。

相反,必须创建和维护另一组类,通常称为数据传输对象(DTO)或视图模型,以用作公共API的输入/输出参数。使用这样的DTO,域模型可以在不修改公共API的情况下进行更改,并且可以通过非常好的控制方式更改公共API。

必须在域模型和DTO之间的应用程序中维护一些映射(也称为绑定)。经常在两个方向。可以找到一个很好的Java映射器/绑定器库列表here