design-patterns - 为什么应该将域实体与表示层隔离?

标签 design-patterns architecture domain-driven-design presentation-layer data-transfer-objects

领域驱动设计的一个部分似乎没有太多细节,那就是如何以及为什么应该将领域模型与界面隔离。我试图让我的同事相信这是一个很好的做法,但我似乎没有取得太大进展......

他们在表示层和界面层中随心所欲地使用域实体。当我与他们争辩说他们应该使用显示模型或 DTO 将领域层与界面层隔离时,他们反驳说,他们没有看到这样做的业务值(value),因为现在你有一个 UI 对象需要维护以及原始域对象。

所以我正在寻找一些可以用来支持这一点的具体原因。具体来说:

  1. 为什么我们不应该在表示层中使用域对象?
    (如果答案是显而易见的,“解耦”,那么请解释为什么这在这种情况下很重要)
  2. 我们是否应该使用额外的对象或构造来将领域对象与界面隔离?

最佳答案

很简单,原因之一是实现和漂移。是的,您的表示层需要了解您的业务对象才能正确表示它们。是的,最初看起来两种类型的对象的实现之间有很多重叠。问题是,随着时间的推移,双方都会增加一些东西。表示发生变化,表示层的需求不断发展以包含完全独立于业务层的内容(例如颜色)。同时,您的领域对象会随着时间的推移而发生变化,如果您没有与接口(interface)进行适当的解耦,那么您就会冒着对业务对象进行看似良性的更改而搞砸接口(interface)层的风险。

就我个人而言,我相信处理问题的最佳方式是通过严格执行的接口(interface)范例;也就是说,您的业务对象层公开一个接口(interface),这是与其进行通信的唯一方式;没有公开有关接口(interface)的实现细节(即域对象)。是的,这意味着您必须在两个位置实现域对象;你的接口(interface)层和BO层。但是,这种重新实现虽然最初看起来像是额外的工作,但有助于加强解耦,这将在未来的某个时候节省大量的工作。

关于design-patterns - 为什么应该将域实体与表示层隔离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821276/

相关文章:

java - Scala/Java 中的编程语言抽象

architecture - 用于新公司基础设施的企业服务/数据总线?

c++ - 通过窗口句柄连接的渲染和窗口系统的独立性

domain-driven-design - 域驱动设计缓存位置

design-patterns - 理解模板方法模式

design-patterns - 端口和适配器架构中的域模型实际上是什么?

dependency-injection - 将存储库接口(interface)作为参数传递给域类上的方法是否被认为是糟糕的设计?

Java Event Sourcing/DDD 框架不污染域层

java - 方法实现

javascript - Angular 2/4/5 系统的良好架构