Architecture 使用DTO是解决此问题的最佳方法吗?

Architecture 使用DTO是解决此问题的最佳方法吗?,architecture,n-tier-architecture,Architecture,N Tier Architecture,我正在使用客户机/服务器系统: 有一个数据库、一个应用服务器和一个用户界面客户端应用程序。应用服务器处理来自客户端应用程序的连接,客户端应用程序在客户端应用程序请求用户列表或特定id对象时,会与数据库进行通信 目前,我有一组数据对象,如user、area等,它们映射到数据库中的表。这些数据对象在共享库中定义,该库在编译时链接到客户端和appserver。它们继承了一个类,该类允许它们被序列化,以便在客户端和服务器之间传递,并且它们将数据提供程序作为依赖项注入,以允许提交发送到应用程序服务器或发送

我正在使用客户机/服务器系统:

有一个数据库、一个应用服务器和一个用户界面客户端应用程序。应用服务器处理来自客户端应用程序的连接,客户端应用程序在客户端应用程序请求用户列表或特定id对象时,会与数据库进行通信

目前,我有一组数据对象,如user、area等,它们映射到数据库中的表。这些数据对象在共享库中定义,该库在编译时链接到客户端和appserver。它们继承了一个类,该类允许它们被序列化,以便在客户端和服务器之间传递,并且它们将数据提供程序作为依赖项注入,以允许提交发送到应用程序服务器或发送到数据库,具体取决于它们是在客户端还是服务器端使用

当客户端应用程序的用户想要编辑用户时,它会从应用程序服务器请求该对象,使用该对象用当前值填充用户界面,允许用户编辑这些值,然后将该对象提交回应用程序服务器,应用程序服务器再将其提交到数据库

这对于这个非常简单的场景来说是很好的,但是随着它变得越来越复杂,用户界面需要的对象可能是由一些底层数据库对象组成的,所以我认为我需要在某种程度上从数据库模型中抽象出来

在这种情况下,我不应该通过序列化将我认为会被称为DAL的对象传递给用户界面,所以我想我需要一些DTOs数据传输对象

我还发现,在我执行业务逻辑的应用程序服务中,我目前通过打开从客户机提交的对象类型来处理这一切,做任何必要的事情,然后提交到数据库。我在想,也许这里我需要业务对象,每个对象都知道如何验证和操作

因此,我可能最终会:

Shared:
 * UserDTO (data transfer object)

Application Server:
 * UserDAL (data access object)
 * UserBO (business object, contains UserDAL)
 * UserDTO (data transfer object as defined in shared lib)

Client:
 * UserDTO (data transfer object as defined in shared lib)
因此,客户机请求用户DTO,根据需要显示或更新,调用save方法,将其序列化并发送到应用程序服务器,应用程序服务器对其进行反序列化,创建业务对象,该业务对象可对其执行任何操作,如验证、保存到数据库等

这意味着将我的所有序列化逻辑从DAL对象删除到DTO对象,并删除我的大业务逻辑类,这将使表示层客户端不再需要了解任何有关数据库结构的信息

这听起来对吗

其他人确实建议将业务对象放在共享库中,而不使用数据传输对象。但问题是,我有两个位置的业务逻辑,最好能在一个位置更新业务逻辑,而不必更新100个与一个应用程序服务对话的客户端应用程序。这还意味着业务对象还必须具有DTO对象的所有get/set例程


我希望这是有道理的。任何想法都将不胜感激:-

我最初的想法是-你的实际问题是什么?因为从我看来你没有做错什么

是-将多个对象放入一个DTO中,然后将其序列化,以便在客户端/服务器之间通过线路进行传输,这听起来对我来说是正确的

是-拥有类型/业务对象的共享库是可以的;我假设它们只不过是没有逻辑的真正“愚蠢”的数据结构,并且它们不会经常更改

所以我想我需要在某种程度上从数据库模型中抽象出来

对。您可以在客户端和服务器之间执行相同的操作。如果您使用的是Microsoft platform/.Net,则可以使用WCF,它允许不同类型的绑定,因此不再需要手动序列化

但问题是我在两个地方有业务逻辑


是的,在两个地方使用它并不理想,但它确实有一些优势。在客户端复制一些业务逻辑的一个好处是,我在这里考虑验证规则,UI可以为用户提供更具交互性的体验,因为用户不必等待往返通知他们不能将姓氏添加到电话号码字段中。您仍然需要在服务器端提供适当的验证和完整的业务规则:可以说是深度防御。

web客户端还是windows客户端?windows客户端。客户机/服务器通过TCP/IP连接。您使用的是什么技术?PostgreSQL作为数据库,其余的是内部专有的内容,包括所有序列化等。以前的项目中已经存在很多。谢谢Adrian。我真正的问题是,是让业务对象共享,还是使用数据传输对象。共享业务对象的问题在于它们可能最终包含在
g逻辑应该只在服务器上——我想它们可能是两个级别的业务对象,但基本上可以回到BO和DTO对象。我可能把问题复杂化了-PS:我不使用.NET,主要是因为它必须是跨平台的,它是直的C++和Qt用于用户界面。我开始认为业务逻辑不仅仅是一个具有业务规则的代码层——我认为没有逻辑的业务对象也是“准”业务逻辑——因为它们定义了使用的数据结构。在整个应用程序中满足业务需求。因此,DTO和您“回忆”的“业务对象”之间存在某种混合;但没有任何“硬”逻辑。