【问题标题】:Domain objects/services and the Business Logic Layer领域对象/服务和业务逻辑层
【发布时间】:2011-08-01 03:23:47
【问题描述】:

什么是软件架构中的领域对象和领域服务?我不熟悉它们或它们与业务逻辑层有何不同?

【问题讨论】:

    标签: java business-logic-layer domain-object


    【解决方案1】:

    不同的人使用这些术语的方式有些不同,但这是我的看法:

    1) “业务”和“域”大致是同义词。 “域”更为笼统,因为它不会假设您正在编写业务应用程序。因此,如果我们正在编写科学应用程序或游戏,我们可能更愿意将代码的相关部分称为“领域”代码而不是“业务”代码。因此,在本说明的其余部分中,我将使用“域”,因为它更通用。

    2) “域逻辑”包含“域对象”和“域服务”。由于各种原因(技术和其他原因),许多架构采用这样一种设计,其中域逻辑被划分为用于存储数据的对象(“域对象”)和操作这些对象的对象(“域服务”)。 Martin Fowler and others have pointed out that that's not very OO 因为 OO 概念的很大一部分是将功能与数据放在一起,这是对的,但它就是这样。域对象是数据,域服务是 do-stuff-with-the-data 部分。

    3) 在领域驱动设计中,想法是回到真正的 OO 设计,因此各种服务方法会回到领域对象,这样您就有了 OO 意义上的对象,而不是有时称为“贫血”物体。在 DDD 中,域对象本身更加健壮,因此它们形成了域逻辑。实际上可能还有一些领域服务,但在 DDD 中这通常比在更传统的领域对象与服务模型中要小。

    【讨论】:

    • @Willie Wheeler 什么应该进入域对象,什么应该进入域服务?我是 mvc 新手。
    • 重读上面的#2 和#3。贫血的业务对象更容易实现,但在 OO 精神中可以说更少。
    • @WillieWheeler 嘿伙计,我是 java 新手,我正在尝试学习如何正确构建 beans/java 域对象。让我们说我有一条龙,它可以有多个类(角色)。 (例如,一条龙可以是追踪者,同时它也可以是前锋。)。我打算在我的主页上显示龙类,当你点击一个类时,它会显示该类下的龙列表,但由于某种原因,我发现很难想出一个关于如何正确执行此操作的结构
    • @Carnal 可用的答案不适合评论。我建议在programmers.stackexchange.com 上为此创建一个实际问题。
    • 关于#2,人们仅仅因为他们的决定而发明的任意代码令人惊讶。
    【解决方案2】:

    业务逻辑层也称为领域层。这是处理所有业务逻辑的层/层。

    域对象和域服务是用于构建域层的类。

    【讨论】:

    • 我认为业务逻辑层和领域层是不同的。我正在阅读 Oreilly 的 Java 最佳实践,我遇到了这一行:If your application naturally separates into standard layers (persistence, domain objects, business logic, presentation), you should consider using EJBs. 那么域/业务逻辑之间有什么区别?
    • 这取决于您选择在应用程序中构建多少层。您可能只有一个两层应用程序,而您可能有多达六或七个不同的层。
    • 领域逻辑 = 业务逻辑
    • DDD 是一种在域复杂时使用的方法。如果专注于核心领域逻辑和建立复杂业务模型的过程(即程序员和领域专家之间的协作)。领域逻辑指的是一般的业务规则,领域对象代表了这个领域逻辑所涉及的各种现实生活中的业务对象(人、贷款、投资者)。
    • @niks:很公平。我非常喜欢使用精确的术语,但是 AFAIKT,这句话仍然有意义 - 即使您牢记这种区别?
    【解决方案3】:

    我们需要了解应用层和领域(业务)层的职责,才能掌握区别。 领域层代表业务对象,主要是业务中的实体,可能在某种程度上抽象,以及领域服务。领域层仅在业务发生变化或领域上下文在业务内发生变化时发生变化。 应用程序层“存在”在域层之上,并且通常(最好)与域层分离,就像 asp.net MVC Web 应用程序一样,其中控制器部分是应用程序层,HTML 部分是表示层。应用层会发生变化以适应特定应用(或服务、API、应用等)的用途

    【讨论】:

      【解决方案4】:

      让我举一个我曾经使用过的企业应用场景的例子,来解释为什么域层和业务层都包含业务逻辑但又不同。

      假设我有一个 COTS 产品,它是一个纯案例管理引擎,比如 OMG CMMN 实现。业务层中的一大堆业务逻辑与数据层中的一堆实体一起使用。

      现在继续假设我有两个客户是系统集成商,一个正在构建法律案例管理系统,另一个需要医疗保健案例管理。两者都是案例管理,但有自己的领域术语、对象、程序、行业架构等。

      每个人都将添加自己的领域层,以便他们可以在各自业务领域的术语和概念中工作。

      所以是的,它包含业务逻辑,但是域层是一种将通用可重用业务与特定业务封装在一起的方式。

      应用程序越“简单”,领域模型和数据模型以及业务逻辑和领域逻辑就越相似。但是当你增加一个组件的“效用”时,最终会分离关注点。

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 2016-12-06
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多