业务层拆解和业务对象类型

Posted

技术标签:

【中文标题】业务层拆解和业务对象类型【英文标题】:Business layer disassembly and business object types 【发布时间】:2013-06-20 21:35:18 【问题描述】:

业务逻辑层包含包含业务逻辑的业务对象。其中一些是持久的,那些是实体。实体及其逻辑构成模型。其中一些是无状态的,并且包含一些不适合任何实体职责的额外逻辑。这些对象是服务(也是模型的一部分?)。

还有一些帮助器/实用程序类,例如 Managers、Factories、Builders。 现在这个反汇编正确吗?

还有一些不是实体或服务的对象,它们可以包含状态。有自己的线程的活动对象。可以长寿。那些物体是什么?只是业务对象还是业务组件?

在我的项目中,我有 Device 类。起初我把它当作实体对象,因为它存储在数据库中。它包含自己的线程,定期从真实设备获取一些数据,并对这些数据执行一些复杂的逻辑。所以它是一个活跃而长寿的物体。我意识到它不能是一个实体,因为它是重/复杂、活跃和长寿的对象(或者它可以???)。所以我把它分成不同的类:

DeviceDescriptor,现在是 Entity 和 DeviceAccess(或Device),包含复杂的业务逻辑,寿命长且活跃。它也是基于 DeviceDescriptor 对象进行初始化的。

这个 DeviceAccess 对象是什么类型的业务对象?

如果我有这样结构的项目,Device/DeviceAccess 对象应该放在命名空间层次结构中的什么位置?

ProjectName.Core – 核心对象、业务对象 ProjectName.Core.Entities – 持久性业务对象 ProjectName.Core.Services – 服务接口 ProjectName.Core.Services.Default – 服务的真正实现 ProjectName.Core.Repositories –(DAL 层)存储库接口 ProjectName.Core.Repositories.SqlServer - 存储库的真正实现

首先我想我应该把这个对象放在 Core 命名空间下。但后来我认为将它视为单独的组件/模块或功能并将其放置在 Core 命名空间之外的 ProjectName.Devices (以及其他帮助对象、存储库和实体 - DeviceDescriptor)可能会更好。你怎么看?

您能否告诉我我的命名空间组织是否正确?它不是由 DDD 指导的。它是一个从 DDD 借来的一些概念的 3 层架构。 (存储库、聚合根、服务、模型)。

如果有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

业务逻辑层包含包含业务的业务对象 逻辑。其中一些是持久的,那些是实体。沿线实体 用它的逻辑制作模型。其中一些是无状态的并且包含 一些不适合任何实体职责的额外逻辑。那些 对象是服务(也是模型的一部分?)。

域将包含聚合、实体、值对象、事件、服务等等。实体仅表示具有生命周期并由 id 标识的概念。

还有一些辅助/实用程序类,例如 Managers、Factories、 建设者。现在这个反汇编正确吗?

什么是经理?它们是否代表领域中的一个概念?工厂最好在聚合根或实体上实现。想想var post = forum.PostBy(user);。构建器可以帮助您构建复杂的对象,支持该语言。例如; carBuilder.PaintedIn(red).Spinning(bigRims)....

还有一些不是实体或服务的对象,它们可以 包含状态。有自己的线程的活动对象。可以很长 住过。那些物体是什么?只是业务对象或业务 组件?

也许您正在寻找的是 Saga 或流程管理器?

在我的项目中,我有 Device 类。起初我把它当作实体 对象,因为它存储在数据库中。它包含自己的线程 定期从真实设备获取一些数据并执行一些复杂的操作 与该数据的逻辑。所以它是一个活跃而长寿的物体。一世 意识到它不能是一个实体,因为它很重/很复杂 和活跃和长寿的对象(或者它可以???)。所以我把它分成 单独的类..

它绝对可以是一个实体,可能是一个聚合根。您是否正在组合多个值对象的实体?值对象是封装逻辑的好方法。

如果我有这样结构的项目,应该在哪里 Device/DeviceAccess 对象放在命名空间层次结构中?

ProjectName.Core – 核心对象、业务对象 ProjectName.Core.Entities – 持久化业务对象 ProjectName.Core.Services – 服务接口 ProjectName.Core.Services.Default——服务的真正实现 ProjectName.Core.Repositories –(DAL 层)存储库接口 ProjectName.Core.Repositories.SqlServer——真正的实现 仓库

您是否考虑过基于功能而非技术模式的命名空间? Here 是基于功能的命名空间命令的示例。

【讨论】:

以上是关于业务层拆解和业务对象类型的主要内容,如果未能解决你的问题,请参考以下文章

业务级对象应该如何命名?

DAL“类型化数据集”或自定义业务对象

spring复杂数据类型传递

OA上传和编辑数据

简单对象到数据库产品

业务对象和数据层