代码之家  ›  专栏  ›  技术社区  ›  Christophe Herreman

DDD和客户端/服务器应用程序

  •  4
  • Christophe Herreman  · 技术社区  · 16 年前

    因此出现了一些问题:

    • 服务器是否应该向客户机公开存储库,或者我们是否需要某种门面(例如,能够处理安全性的门面)
    • 客户机是否应该实现存储库(一般来说是DDD?)知道在客户机中,大多数逻辑都与视图相关,并且真实的业务逻辑存在于服务器上。所有与服务器的通信都是异步进行的,我们在客户机上有一个单线程编程模型。
    • 如何将客户端对象映射到服务器对象,反之亦然?我们尝试了DTO,但又恢复到公开对象的状态并直接映射到它们。我知道这被认为是不好的做法,但它为我们节省了难以置信的时间)

    1 回复  |  直到 16 年前
        1
  •  2
  •   cliff.meyers    16 年前
    1. 我不会直接向客户机公开存储库。您提到的第一个大问题是安全性:您不能信任客户机,因此无法向潜在的恶意客户机公开数据访问API。
    2. 在服务器上用服务包装存储库,并在客户端中创建一个处理远程通信的瘦委托层。
    3. 公开实体并不一定是一种糟糕的做法,只是当您开始考虑延迟加载、通过客户端不需要的线路发送数据等因素时,它会变得有问题。如果您编写一个DTO类来包装一个或多个实体,并委托get/set调用,您实际上可以非常快速地构建DTO层,特别是使用大多数IDE中可用的代码生成。

    所有这些的关键在于,一组模式实际上应该只应用于应用程序的一部分,而不是整个应用程序。您的域模型中有丰富的逻辑,并且使用存储库作为DDD的一部分进行数据访问,这一事实不应该以任何方式影响客户机。从概念上讲,我构建的RIA有三层:

    1. 客户端使用类似MVC、MVP或MVVM的东西来显示UI。模型层最终调用。。。

    2. 我可以称之为“集成层”。这是一个服务和数据对象的契约,存在于客户机和服务器上,允许两者协调。通常,UI设计驱动这一层,以便(A)只将客户端需要的数据传递给它,(B)数据访问可以是粗粒度的,即“对这组UI所需的所有状态进行一次方法调用”。

    3. 服务器使用它想要处理的任何业务逻辑和数据访问。这可能是DDD或更老派的东西,比如使用数据库中存储的进程和许多“ResultSet”或“DataTable”对象构建的数据层。

    关键是客户机和服务器都是非常不同的动物,它们需要独立变化。为了做到这一点,您需要在UI需求和服务器上的实际情况之间建立一个公平的折衷层。