多层架构中,是否可以跳过业务层进行增删改查操作?

2024-03-05

我们有 3 层应用程序,其中来自服务层的每个调用都进入业务层并由数据层保存。每层组件只能调用下面的层;

然而,由于我们有数百个实体,并且有很多与 CRUD 操作相关的服务,因此我们的团队引发了很多争议。

有些人认为,为了维护和易于开发,最好从 CRUD 服务调用数据访问,该服务只进行 CRUD 操作并绕过业务层。

相反,有人说我们必须为业务层中每个实体的数据访问创建包装器,并从服务调用这些包装器,并且永远不允许服务调用数据访问层。

您认为我们应该采取哪种方式? CRUD服务可以调用数据访问并绕过业务层吗?


如果没有要执行的业务逻辑,就没有理由强制执行业务层。三层架构并不是一个神秘的协议,只是假设业务处理而形成的最佳实践。

在当前的应用程序中,当不涉及业务流程时,我们经常直接从 JSF 控制器访问 DAO。这个想法是由一个爪哇冠军 http://en.wikipedia.org/wiki/Java_Champions他强调简单性是最重要的理念。

如果您担心将来可能需要添加业务逻辑的修改。我是这样想的:额外的业务逻辑无论如何都会添加到业务层,包括数据访问,所以这里没有区别。

CRUD 代码大多非常简单。因此,服务中的更改相当于将 DAO 的单个调用或几个调用重新路由到 EJB - 一个简单的重构。 CRUD 代码本身仍将保留,但将被推送到 EJB 中 - 另一个简单的重构。

这并不完美,但在我看来比替代方案更好:有一个空的间接层。这增加了没有任何意义的复杂性。业务对象除了将调用转发到 DAO 之外什么也不做。

那里有两个代码异味 http://en.wikipedia.org/wiki/Code_smell我认为适用于这种情况:人为的复杂性和特征羡慕 http://c2.com/cgi/wiki?FeatureEnvySmell.

我并不是说业务层中的 DA 有某种代码味道。我的意思是拥有一个业务对象没有其他的但代理DAO是有味道的。复杂性也是如此 - 添加的数据结构/架构层没有自己的用途 - 您的应用程序中似乎已经有一个 DAL。

您需要考虑的另一个方面是 - 对于开发人员来说,看到直接使用 DAO 的服务有多令人惊讶?拥有 5 个服务(其中 2 个直接访问 DAO)与拥有 100 个服务(其中只有一个服务直接访问 DAO)不同。

在第一种情况下,代码的简单性将超过增加的概念复杂性(单个事物有两个概念),在第二种情况下,我宁愿坚持业务层 - 这样做的惊喜(也称为 WTF 效果;)不同的是,只有一次就太大了。

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

多层架构中,是否可以跳过业务层进行增删改查操作? 的相关文章

  • “纯”MVC 实现有多大用处?

    我在一家提供类似 CRM 的定制软件的公司工作 我们目前正在重新设计 重新开发该软件 希望它看起来更现代 并且更容易为未来的客户开发和定制 目前 定制每个新应用程序都需要很长时间 有一种假设是 花费这么长时间的原因是 视图 层中存在大量业务
  • Hibernate 标准接受 %% 值

    我正在使用下面的 Hibernate 代码来过滤workFlowName crt add Restrictions like workFlowName workFlow MatchMode ANYWHERE crt is the crite
  • 从一台服务器到多台可配置服务器的 JNDI 查找

    我们在具有不同 IP 的不同机器上有几个 JBoss 服务器 不是集群 而是属于不同客户的单个独立 JBoss 7 1 1 实例 所有系统上都部署了完全相同的 EAR 我们尝试发送一个名为Group从一个系统到另一个系统 问题 我们尝试了一
  • android/eclipse 中的网络服务

    我需要通过soap 方法使用android eclipse 的Web 服务 即 我必须提供输入并根据用户输入从网络服务显示适当的结果 如何做到这一点 java类 public class Demo webserviceActivity ex
  • gpg:抱歉,根本没有请求终端 - 无法获取输入

    解密时出现以下错误 eyaml decrypt s ENC and the key goes on here gnupg quiet no secmem warning no permission warning no tty yes de
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 为什么更喜欢 REST 而不是 SOAP?

    如果我需要一个 Web 服务来来回传递一个复杂的对象 我是否有理由更喜欢 SOAP 而不是 REST 以下是可能的 SOAP 消息的示例
  • java.lang.NoClassDefFoundError: javax/ws/rs/core/Configuration

    我正在实现轻松的网络服务 并且正在使用 jboss 4 0 但我遇到以下异常 java lang NoClassDefFoundError javax ws rs core Configuration 我的 web xml 是
  • PouchDB可以在客户端代理一个大数据库吗?

    在单页应用程序上工作时 我必须编写大量样板代码才能与服务器端数据同步 PouchDB http pouchdb com 为这个问题提供了一个优雅的解决方案 允许在客户端本地访问数据 我不明白的是 当数据库太大而无法完全适应浏览器内存时 Po
  • 如何在 J2EE 中进行动态 URL 重写

    回到我的 ASP NET 时代 我使用URL重写器 NET http urlrewriter net 进行动态 URL 重写 基本上 它是一个 HTTPModule 可以拦截页面请求并根据您定义的规则重写 URL 与 MOD REWRITE
  • 如何在 Eclipse Juno 中使用 post 请求调试动态 Web 项目

    我可以使用 Get 请求轻松调试 在服务器上调试 Tomcat 已启动 我可以轻松继续 因为我只需要在 url 中传递参数 但我不确定如何使用 post 请求进行调试 Currently I am using Advanced Rest C
  • 在 Eclipse 的包资源管理器中突出显示类文件

    我为eclipse开发了一个插件 可以在项目的弹出菜单中添加一个选项 此选项将按名称搜索类 然后它应该在包资源管理器中突出显示该类 我对突出显示部分有疑问 我在文件夹中搜索类 所以我有类路径 但我不知道如何突出显示它 我尝试了这个 但没有得
  • 是否可以将 WSDL 与 REST Web 服务结合使用?

    我是网络服务领域的新手 是否可以将 WSDL 与 REST 绑定一起使用 或者我应该使用 WADL 可以将 WSDL 与 REST 绑定一起使用 但这实际上没有必要 REST 的简单性使得编写代码来使用该服务变得非常容易 使用 WSDL 只
  • GWT 与 Apache Wicket

    GWT 和 Wicket 都是有状态的 基于 Java 对象的 GWT 完全基于客户端 具有 javascript 优化 CSS 优化等功能 而且我对 Apache Wicket 还很陌生 我对 Wicket 的了解越多 就越感觉它与 GW
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • Log4Net“找不到架构信息”消息

    我决定使用log4net http logging apache org log4net index html作为新 Web 服务项目的记录器 一切工作正常 但对于我在我的应用程序中使用的每个 log4net 标签 我都会收到很多类似下面的
  • 升级到 Netbeans 8.0.1 和 Glassfish 4,1 后包不存在

    我正在学习 JavaEE CDI 并使用 NetBeans 8 0 Glassfish 4 创建了一个小型应用程序 升级到 NetBeans 8 0 1 和 Glassfish 4 1 后 我收到很多错误报告 指出某些包不存在 例如 我无法
  • 如何保护 RESTful Web 服务的安全?

    我必须实施安全RESTful Web 服务 https www ibm com developerworks webservices library ws restful 我已经使用谷歌做了一些研究 但我陷入困境 Options TLS H
  • 如何在 Eclipse 中使用 Hibernate Tools 生成 DAO?

    我在用着 Eclipse Java EE IDE Web 开发人员 版本 Indigo 发布 使用 hibernate 工具 我对 Eclipse 中的 hibernate 很陌生 所以我学习如何配置 hibernate 并使用注释生成 P
  • 在发送传出请求之前将新的 SoapClient 绑定到特定 IP 地址

    假设应用程序所在的计算机具有 SoapClient 具体来说 我正在使用 Microsoft Web Service3 Messaging SoapClient 它通过发送传出请求并获取 SoapEnvelope 作为回报 完善的流程 与远

随机推荐

  • 如何使用 Swift 从 iOS HealthKit 应用程序读取心率?

    我正在使用以下 Swift 代码 let sampleType HKSampleType HKSampleType quantityTypeForIdentifier HKQuantityTypeIdentifierHeartRate le
  • 如何将 LaTeX 片段直接包含在 Doxygen 注释中?

    我希望能够使用一些合适的编辑器在外部编辑一些 Doxygen 注释的 LaTeX 部分 我只会在复杂的环境中使用它 为此 我想我可以拥有纯 LaTeX 文件并从 Doxygen 中包含它们 我确实为以下内容创建了 Doxygen 别名 be
  • django搜索页面未找到错误

    我陷入了困境 我应该能够在页面上输入搜索查询 并且 django 应该返回匹配页面的列表 如果有 但它没有向我显示任何页面 即使它在那里 并且给了我一个错误 假设我有一页内容为一 当我搜索时 我收到此错误 找不到页面 404 请求方式 GE
  • 如何简单地删除旧的核心数据并重建新的?

    我尝试将 coreData 迁移到新版本 我正在执行以下步骤 添加新的模型版本 选择 name xcdatamodeld 然后选择 Editor gt Add 模型版本 在进行任何更改之前 如果您已经有应用程序 提交到App Store的是
  • 具有空键功能的线程安全映射

    我需要一个多线程 Map 对象在我的 Web 服务器的缓存中使用 并且我需要null keys HashMap允许我有空键 但是ConcurrentHashMap没有 我尝试创建一个同步版本HashMap using Collections
  • 如何使用openpyxl通过DefinedName获取单元格内容?

    例如单元格的坐标为A1 设置aDefinedName name cat with coordinate A1 然后我想读取内容cell via DefinedName cat 但好像不支持 还有其他方法可以帮忙吗 请参阅此处的示例图片 ht
  • 如何调试内置的 Python 命令、包或模块?

    我想调试 Python 安装附带的一些基本包和 或内置包 包括pip and venv 这个愿望来自于文件权限的错误消息 无法访问具有 不可打印文件名 的文件 我的一些团队正在运行这些命令 请参阅这个问题 https stackoverfl
  • Google 表格到日历 - 更新之前的活动脚本

    我在表格中设置了预算 并有一个脚本可以用截止日期更新我的日历 我的脚本是 function onOpen var ui SpreadsheetApp getUi ui createMenu Sync to Calendar addItem
  • CMake-CPack包安装路径噩梦

    我对 CMake CPack 感到沮丧近一周了 不好的是 CMake CPack 在线文档没有很好地记录这部分 经过谷歌搜索后 我找到了可以使用的变量 CPACK PACKAGING PREFIX NOT documented CMAKE
  • 按分钟对索引进行分组并计算平均值

    所以我有一个名为 df 的 pandas 数据框 我想删除秒数并只使用 YYYY MM DD HH MM 格式的索引 然后还会对分钟进行分组并显示该分钟的平均值 所以我想把这个数据框 value 2015 05 03 00 00 00 61
  • 5 分钟内的 Maven 问题

    我正在跟进5 分钟内完成 Maven http maven apache org guides getting started maven in five minutes html手册包含以下内容 mvn archetype generat
  • MapGroupsWithState 的 Spark 结构化流状态存储在哪里?

    我知道状态作为状态存储保存在检查点位置 但我不知道它还在内存中 存储在哪里 我创建了一个使用mapGroupsWithState的Streaming作业 但我看到执行器使用的存储内存为0 这是否意味着状态存储在执行内存中 我无法知道状态消耗
  • 如何在 Swift 中将字典保存到核心数据

    使用 Core Data 保存字典的最佳方法是什么 我有一本字典定义为 var myRecipes String Recipe 其中 Recipe 是一个包含菜谱健康信息的结构 该字符串将是 早餐 或 午餐 等类别 而食谱数组将包含早餐或午
  • 如何检查嵌入资源是否存在?

    在 Delphi 中 我正在构建一个 HTTP 应用程序 或者更确切地说是一个 Web 服务器 它本质上是一个内置于单个 EXE 文件中的整个网站 我嵌入的文件包括 HTML JS CSS SWF PNG XML 等 资源名称与原始文件名相
  • Drools-如何找出所有规则都匹配了?

    我有一个 DRL 文件 其中有 10 条规则 一旦我插入一个事实 一些规则可能会被匹配 我如何找出以编程方式匹配的规则 请注意 此答案对于 Drools 5 x 及以下版本有效 如果您已转到 6 或更高版本 请查看 melchoir55 修
  • 在 Dispatchertimer.Tick 事件中发送额外参数

    我的问题是如何在 Dispatchertimer Tick 事件中发送一些参数 这是代码 我想要的是在dispatcheTimer Tick处接收一个整数值 dispatcherTimer Tick new EventHandler dis
  • SQLITE_TRANSIENT 在 Swift 中未定义

    我正在使用 xcode 6 并且我已经导入libsqlite3 dylib and libsqlite3 0 dylib 我还添加了Bridging Header h文件女巫导入 sqlite3 h 我可以打开 SQLite 数据库并执行简
  • PHP:根据固定基准日期获取下一个日期

    PHP 有没有办法使用给定日期的 4 周间隔获取下一个日期 Example 我的开始日期是 2014 年 1 月 3 日星期五 我的间隔是从该日期起每 4 周一次 我正在寻找的是当前日期中与此 4 周间隔相匹配的下一个日期 或多个日期 如果
  • Google Maps API 和标记之间的自定义折线路线

    我想为 Android 应用程序创建一个自定义路由 我不确定应该使用哪个 API 以及它是否与 Java 兼容 据我所知 我需要使用航点来制定路线 我不需要知道两点之间的距离 只需制定路线 目标是从地图一侧的菜单中选择一个选项 并显示两个标
  • 多层架构中,是否可以跳过业务层进行增删改查操作?

    我们有 3 层应用程序 其中来自服务层的每个调用都进入业务层并由数据层保存 每层组件只能调用下面的层 然而 由于我们有数百个实体 并且有很多与 CRUD 操作相关的服务 因此我们的团队引发了很多争议 有些人认为 为了维护和易于开发 最好从