当业务逻辑和数据层似乎重叠时,分解它们的最佳设计是什么? [关闭]

2024-01-12

我正在构建一个 MVC Web 应用程序(使用 Spring MVC 框架),并且我对设计特定区域的最佳方法有点困惑。

应用程序必须与一系列 Web 服务进行交互,这些服务并不是真正经过精心设计,并且本身没有提供太多抽象 - 基本上,每个创建/更新/检索/删除操作都有一个 Web 服务方法每个“数据类型”,除此之外没有太多的 API。 Web 服务客户端需要知道要调用哪些方法以及以何种顺序调用,以便能够创建所需的数据 - 换句话说,不存在基于“事务”的方法。

例如,仅仅创建一个新的用户帐户就需要调用总共七种不同的 Web 服务方法来设置必要表中的所有记录(一个user记录一下,添加正确的privileges对于该用户,设置该用户的billing详细信息等)。

我正在努力寻找最好的方法来抽象它并将其封装在我们的应用程序中。大多数应用程序都遵循标准流程:

request ---> Controller <---> Service/Business-level object <---> DAOs for data access

在我的应用程序中,我使用自己的一组“域对象”来表示和抽象 Web 服务 WSDL 中定义的数据类型,以便我的域逻辑不依赖于 Web 服务类型,以便我们可以抽象和隐藏无论我们喜欢哪个细节。

我正在寻找一些意见,以设计我上面提到的“用户创建过程”作为示例的最佳方式。正如我所提到的,创建“普通用户”的过程涉及调用七个不同的 Web 服务,但这只是用户的一种“类型” - 我们必须能够创建几种不同类型的用户,每种类型都需要不同的要调用的 Web 服务。

目前我只设计了这个“普通用户”创建,作为概念证明 - 我有一个域对象User, a UserDao接口有以下方法getUser(name) and createUser(User), and a WebServiceUserDao它实现了UserDao方法并知道如何调用上述七个Web服务方法。这createUser()方法被调用UserCreationService,这是我的业务/服务级别类,它又由SignupController.

但是扩展这个逻辑以便能够创建不同的用户类型(它们由不同的值表示)User.getType(),我不确定业务/服务层类和 DAO 之间的界限在哪里。例如,我应该:

  1. 创建一个UserDao每个“用户类型”的实现,因此创建每个“用户类型”的逻辑可以封装在它自己的类中,并让UserCreationService决定哪个UserDao使用?这对应于 1 个服务类别:许多 DAO。
  2. 我应该打破UserDao分成更小的部分,一个对应于需要在 Web 服务/数据库中创建的每个“记录”,即使我的整个应用程序不需要了解这些单独类型中的每一种?然后有不同的UserCreationService各种不同“用户类型”的实现?换句话说,这个策略将有一个PrivilegesDao, a BillingPlanDao等等,即使我不需要相应的Privilege or BillingPlan域对象。这将是许多服务类别:许多 DAO。
  3. 包含需要为每个“用户类型”调用 Web 服务的所有逻辑WebServiceUserDao?这会有一个非常复杂的缺点 类(PMD 已经在抱怨圈复杂度),但所有这些逻辑都将封装在一个类中,并且从整体 API 角度来看可能会减少复杂性。

我对这个应用程序的一个目标是确保如果我们必须更改数据持久性的细节,我们所需要做的就是更改 DAO 实现 - 如果我们必须开始与不同的计费系统进行交互,除了 DAO 级别之外,我不希望应用程序的任何部分发生更改。

有什么意见吗?当“业务逻辑”与“数据访问逻辑”似乎重叠时,在决定在何处分解它们时,您会使用什么样的策略?


当“业务逻辑”与“数据访问逻辑”似乎重叠时,在决定在何处分解它们时,您会使用什么样的策略?

也许您可以拥有三层而不是两层:“一层额外的间接层”。

在顶层,您可能具有不了解数据访问的业务逻辑:该业务层使用类似的类User, Account等等,也许还有一些工厂方法,比如User.getAccounts and Account.getOwners.

底层可能是数据访问层,它是数据层的包装器或外观。

在这两层之间,有一个层知道您的业务对象是什么(例如用户和帐户),但不知道您的业务逻辑是什么。中间层了解您的数据访问层。中间层的工作是使用数据访问层的 API 来 I/O 您的业务对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当业务逻辑和数据层似乎重叠时,分解它们的最佳设计是什么? [关闭] 的相关文章

  • 中断并标签,“标签 MyLabel 丢失”

    我有这样的代码 if condition1 break MyLabel while true some code here MyLabel if condition2 break more code here 我收到此错误 标签 MyLab
  • 在 portlet 中设置 SearchContainer 以使用 EL 和 JSTL 在 JSP 中使用它

    我正在尝试使用SearchContainer在我的liferay应用程序中 目前我必须使用 JSP Scriplets 来设置results in
  • Java Swing 应用程序消息对话框帮助

    我正在开发 Java Swing 应用程序 我需要创建一个如图所示的对话框 我不知道这个的名字 我无法解释 所以我附上一张照片 请告诉我这叫什么以及如何在我的 GUI 应用程序中创建它 给猫剥皮的方法不止一种 public final cl
  • 我在使用 JavaFX 绘制十字时遇到问题

    我正在尝试编写代码 在网格上对角绘制 3 个形状 前两个形状是正方形和圆形 我能做到 然而 第三种形状让我有些悲伤 我应该画一个十字 T 版本 而不是 X 每次我写出代码时 它看起来就像一个侧面 我知道我只是错过了一些简单的东西 但我真的很
  • Spring安全+LocaleResolver

    我需要在身份验证成功后更改区域设置 区域设置解析器
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • 像 Google Play 商店一样在垂直 RecyclerView 中动态不同图像水平 RecyclerView

    我一直在关注这个教程 http android pratap blogspot co za 2015 12 horizo ntal recyclerview in vertical html http android pratap blog
  • 始终等待页面加载到 PageObjects 上

    因此 当出现问题时 我只是创建了一个简单的 selenium JBehave 代码 我将首先发布简化的代码 然后稍后解释我的问题是什么 所以这里我们有一个简单的 AbstractClass 它将在我的 PageObjects 上继承 此类仅
  • NIO 直接缓冲区何时以及如何被释放?

    我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
  • Eclipse 无法识别 persistence.xml 的内容

    我在 eclipse 中收到以下错误 persistence xml 文件没有可识别的内容 我的 persistence xml 文件在我的应用程序中工作得很好 但 eclipse 一直给我这个错误 我在移动文件并使用 m2eclipse
  • Java - 调整图像大小而不损失质量

    我有 10 000 张照片需要调整大小 因此我有一个 Java 程序来执行此操作 不幸的是 图像的质量损失很大 而且我无法访问未压缩的图像 import java awt Graphics import java awt AlphaComp
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • java.lang.ClassNotFoundException: org.jboss.logging.Logger

    我有一个奇怪的问题 我有一个JMS https en wiktionary org wiki JMS客户端应用程序和MDB https en wikipedia org wiki Enterprise JavaBeans Message d
  • 将 Maven 控制台与 m2eclipse 一起使用

    Maven 新手在这里 有没有办法在 Eclipse 中打开控制台并在 M2Eclipse 插件上执行 Maven 命令 这是一个非常好的插件 但我环顾四周 没有找到我想要的一些功能 谢谢 如果你想运行特定的maven插件 你可以这样做 g
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • 在Java内存管理中,“PS”代表什么?

    每当我看到 Java 中对内存的引用时 各种空格总是以 PS 为前缀 PS 是什么意思 它开始困扰我 到目前为止我唯一的猜测是 泳池空间 但这将是多余的 例子 PS伊甸园空间 PS 幸存者空间 PS 终身空间 老一代 PS Perm Gen
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl

随机推荐