具有多个数据源的工作单元?

2023-11-23

有可能(甚至很可能)我只是没有完全理解“工作单元”的概念。基本上,我将其视为面向对象环境中使用的广泛事务。启动工作单元、与对象交互、提交或回滚。但这如何分解为这些对象背后的数据存储上的实际事务呢?

在具有单个 DB 和 ORM(例如 NHibernate)的系统中,这很容易。事务可以通过ORM来维护。但是,如果系统中的自定义域模型掩盖了许多不同的数据源,情况又如何呢?并非所有这些数据源都是关系数据库? (这里对文件系统做了很多工作。)

现在,我坚持这样的想法:“您根本无法在同一个‘原子’业务操作中跨 SQL2005 DB、SQL2000 DB、DB2 DB 和文件系统维护事务。”因此,目前团队中的开发人员(通常彼此独立工作)有责任在代码中手动维护事务。每个数据库都可以有适当的事务,但整个业务运营是手动检查和平衡每一个重要步骤的。

然而,随着领域复杂性的增加和标准开发人员的流动,随着时间的推移,这种方法将变得越来越困难且容易出错。

有没有人有关于如何最好地解决这样的域的建议或示例,或者以前如何解决它?在这种情况下,实际的“域”仍然处于起步阶段,作为一个原型不断发展,有一天会扩展和消耗/替换由不同的遗留应用程序组成的大型生态系统。因此,有足够的空间进行重新设计和重构。

作为参考,我当前目标的设计的 10,000 英尺视图是:调用基于消息的中央服务的尽可能小的小型客户端应用程序的大集合。该服务是进入“域核心”的入口,可以被视为一个大型 MVC 风格的应用程序。向服务发出请求(很像“操作”),这些请求由处理程序(很像“控制器”)接收。任何程序性的东西都在那里。它们与包含所有业务规则的模型进行交互。模型发布事件,侦听器(“服务”?这部分在设计中仍然很模糊,有待改进)通过与存储库(数据库 x、数据库 y、文件系统、电子邮件、任何外部资源)交互来拾取和处理。一切都相应地愉快地进行了依赖注入。

抱歉啰嗦了:)但是如果有人有任何建议,我很乐意听到。即使(特别是)如果该建议是“你的设计很糟糕,请尝试这个......”谢谢!


我之前开发过一个可以完成此任务的系统,而且相当简单。由于您的项目还处于早期阶段,也许这对您来说可能是有用的信息。不幸的是,我无法再访问该代码,但仍然可以轻松地描述它的工作原理。

我所做的是使用通用存储库模式实现来构建我的存储库。基本存储库类型始终由服务和 UoW 引用。为了便于讨论,我们将其称为 BaseRepository。 “T”仅限于 IEntity 实现,它表示域对象。从 BaseRepository 中,我创建了另一组用于合成的基类,例如 SqlBaseRepository、XmlBaseRepository 等。

UoW 只关心 BaseRepository 类型的东西,这是核心功能所在的地方。将表示基本 CUD(CRUD),提供创建、更新和删除的等效项。其中每一个要做的就是创建一个委托并将其放置在 UoW 内的队列中,同时传递有关它将是什么类型的事务的信息以及完成它所需的适当数据。华盛顿大学将开始维护一份需要参与交易的存储库列表,但仍然不关心它是什么类型。实际上,在这里排队就像参加交易一样。

BaseRepository 定义了一个名为 .ApplyChange() 的抽象方法。一旦在UoW上调用.Commit(),它将创建一个TransactionScope()并开始调用列表中的委托,将信息传回.ApplyChange()。 .ApplyChange() 的实际实现存在于特定的存储库库中,即 SqlRepositoryBase 等,并且也可以被实现覆盖。

至少对我来说,棘手的地方是回滚。我只处理单个数据库,但有时会进行基于文件的更改。我添加了 .RevertChange() 方法并开始跟踪原始状态和修改后的状态,以便我基本上可以应用反向增量来返回到文件堆栈上的位置。

我希望我能更具体地说明实现,但自从我看到代码以来已经一年多了。我可以告诉你,原始代码的基础来自这本书,使用 C# 进行 .NET 领域驱动设计:问题 - 设计 - 解决方案,蒂姆·麦卡锡着。我的大量存储库实现都是基于他的示例,我的大部分定制都来自 UoW 及其实现。

我希望这有所帮助! :-)

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

具有多个数据源的工作单元? 的相关文章

  • 在事务结束时发送事件

    我有一个服务对象的接口 如下所示 为简洁起见进行了简化 public interface ItemService public Item getItemById String itemId int version public void c
  • 使用 Google Cloud Functions 实现微服务的 API 网关

    Inputs 例如 我们有一些服务 账户服务 产品服务 支付服务 每项服务都是一个单独的 Google Cloud Function 每个服务都有自己的 HTTP API 例如 账户服务有 https REGION FUNCTIONS PR
  • 呈现模型与被动视图

    我想知道上述两种模式之间的区别 当您考虑到您需要在表示模型模式中同步代码并且该代码位于表示模型本身中时 那么我认为这些模式非常相似 两者都将事件委托给演示模型 演示者 演示模型和演示者命令域模型 并且也观察域模型 当发生更改时 它们都与视图
  • 使用 i386 arch 而不是 x86_64 在 OSX 上构建 libFLAC

    我正在尝试构建 libFLAC 以在我的项目中使用 但是当涉及到链接时 GCC 会忽略该库 因为它说它不是为当前体系结构 i386 构建的 当我以 64 位编译程序时 它正确链接了库 这意味着该库是针对 x86 64 架构编译的 不幸的是
  • 如何为 HTTP GET 的多个 Key-Value 参数设计 REST URI

    我正在设计一个 RESTful API 一项服务应该提供多个键值对的查询功能 例如 客户端可以使用一个 HTTP GET 请求来查询不同的产品及其关联的数量 客户想要查询金额为 44 的产品 1 和金额为 55 的产品 2 我实际上不希望我
  • 如何以 REST方式发送 HTML 表单?

    我有一个名为 事实 的资源集合的 URI 以及该集合中每个 事实 资源的 URI 我相信 创建新 事实 的表单应该使用 GET 来请求 但我无法确定应该将其设置为哪个 URI 对集合 URI 的 GET 应返回 事实 资源 URI 的列表
  • C:epoll和多线程

    我需要创建专门的 HTTP 服务器 为此我计划使用 epoll sycall 但我想利用多个处理器 核心 但我无法提出架构解决方案 ATM我的想法如下 使用自己的epoll描述符创建多个线程 主线程接受连接并将它们分配给线程epoll 但还
  • 插件架构中的反射与属性

    我正在开发一个在启动时从子目录加载插件的应用程序 目前我正在通过使用反射来迭代每个程序集的类型并查找实现 IPluginModule 接口的公共类来实现此目的 由于反射涉及性能影响 并且我预计一段时间后会有多个插件 我想知道定义在程序集级别
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

    给定一个复杂的对象层次结构 幸运的是它不包含循环引用 如何实现支持各种格式的序列化 我不是来讨论实际实施的 相反 我正在寻找可能派上用场的设计模式的提示 更准确地说 我正在使用 Ruby 我想解析 XML 和 JSON 数据以构建复杂的对象
  • QuickBlox:arm64 架构的未定义符号

    我使用 Xcode 6 4 并使用 cocoapods 安装了 QuickBlox 框架 使用该框架后 我收到一些错误 例如 Undefined symbols for architecture arm64 OBJC CLASS QBSet
  • 您的 Web 服务版本控制最佳实践是什么?

    我们有 2 个独立的产品 需要通过 Web 服务相互通信 支持 API 版本控制的最佳实践是什么 I have 本文 http www ibm com developerworks webservices library ws versio
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • 如何在不同的分辨率/屏幕上提供相同的应用程序

    Scenario 您需要在不同的屏幕上展示相同的应用程序 假设标准的 15 英寸 17 英寸 便携式 10 英寸和移动 4 英寸 可能在不同的分辨率下工作 Question 您是否尝试采用一种根据可用空间重新排列的流动布局 或者您是否滚动
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • 生成单调递增整数(最大 64 位)

    作为新项目的一部分 我们需要一个可以生成单调递增整数的服务 该服务的要求是 服务不需要生成连续的整数 只要它生成单调递增的整数就应该没问题 它应该产生 64 位整数 该服务应该具有高可用性 服务应该能够适应故障 或重新启动 我本来打算使用r
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • 什么时候应该构建 Web 应用程序而不是胖客户端?

    我想听听其他人关于何时应该构建 Web 应用程序而不是构建胖客户端的建议 在过去的几年中 我参与了多次关于是否应该使用 Web 浏览器界面构建应用程序 或升级旧应用程序 的讨论 通常这些是组织内使用的内部系统 而不是大众市场的收缩包装产品

随机推荐

  • 获取当前光标位置

    我想获取窗口当前的鼠标位置 并将其分配给2个变量x and y 相对于窗口的坐标 而不是相对于整个屏幕的坐标 我正在使用 Win32 和 C 还有一个简单的额外问题 您将如何隐藏 取消隐藏光标 您可以通过调用获取光标位置GetCursorP
  • iOS 截取多个屏幕截图

    我有一个NSURL包含一个视频 我想每秒录制该视频的一帧十次 我有可以捕获播放器图像的代码 但我无法将其设置为每秒捕获 10 帧 我正在尝试类似的操作 但它返回视频的相同初始帧 正确的次数 这是我所拥有的 AVAsset asset AVA
  • 在redshift中使用sql函数generate_series()

    我想在redshift中使用生成系列功能 但没有成功 redshift 文档说不支持 下面的代码确实有效 select from generate series 1 10 1 outputs 1 2 3 10 我想对日期做同样的事情 我尝试
  • 如何在Google Map sdk iOS中绘制从一个地方到另一个地方的路径?

    我需要在谷歌地图中找到从一个地方到另一个地方的路径 如何使用 google 地图 sdk iOS 绘制方向图 任何人都可以给出源代码 然后解释如何实现这一目标 Below i attached image also i need to ac
  • scala 中的泛型不变协变逆变

    这可能是一个非常愚蠢的问题 但即使在挠了很长时间之后我也无法理解其中的区别 我正在浏览 scala 泛型页面 https docs scala lang org tour generic classes html 这里据说 注意 泛型类型的
  • 如何使用类型特征进行条件编译?

    我正在尝试编写类似的代码here但使用 C 11 功能 不使用 Boost 工作自这个例子 我试图定义一个response trait 以及基于特征结果的条件编译 我怎样才能做到这一点 include
  • 从 XML 文档中获取指定的 Node 值

    我在浏览 XML 文档 使用 C 并获取所有必要的值时遇到问题 我成功地遍历了 XML 文档中所有指定的 XmlNodeList 成功获取了其中的所有 XmlNode 值 但我必须获取此 XmlNodeList 之外的一些值 例如
  • Webpack 和 angularJs

    我正在尝试使用 angularjs 和 webpack 运行简单的应用程序 这是我的代码 索引 html Full Name firstName lastName app js var app angular module myApp
  • 如何在 OAML 中读取位图?

    我想使用 OCAML 读取位图文件 从文件系统 并将像素 颜色 存储在具有位图维度的数组中 每个像素将占用数组中的一个单元格 我找到了这个功能Graphics dump image 图像 gt 颜色数组 数组但它不从文件中读取 影像影像应该
  • Python 正则表达式 \w 与组合变音符号不匹配?

    我有一个带有组合变音符号的 UTF8 字符串 我想将它与 w正则表达式序列 它匹配带有重音符号的字符 但如果存在带有组合变音符号的拉丁字符则不匹配 gt gt gt re match a w w wz u aoooz re UNICODE
  • jsonschema2pojo 不从 json 字符串生成 pojo 类

    我正在关注链接从 JSON 生成 Java 类 从 json 字符串 而不是从模式 创建 POJO 类 我正在使用 0 4 10 版本的 jsonschema2pojo jar 但无法生成 POJO 类 我的代码如下 public clas
  • 通过 RESTeasy 上的名称绑定将过滤器与特定方法匹配

    我正在尝试指定一个仅与我的某些 API 调用关联的预匹配过滤器 方法如下 RESTeasy 文档建议 我的代码如下所示 姓名绑定 NameBinding public interface ValidateFoo 资源 Path foo ba
  • NGINX 反向代理和访问控制允许来源问题

    我正在配置一个NGINX Reverse Proxy 在浏览器上我转到 客户端网址 https www hollywood com 那么上面的网页需要执行以下请求 服务器网址 https server hollywood com api a
  • sudoers NOPASSWD: sudo: 不存在 tty 且未指定 Askpass 程序

    我添加了一个这样的用户 adduser system home no home no create home group disabled password disabled login testuser 将用户添加到组中 adduser
  • scrapy中提取类名

    我正在尝试取消 trustpilot com 的评级 是否可以使用scrapy提取类名 我正在尝试抓取由五个单独图像组成的评级 但这些图像位于具有评级名称的类中 例如 如果评级为 2 则开始 div class star rating co
  • php:会话与数据库

    我有一个类从数据库中检索其成员 或多或少 10 个成员 我的问题是 每次从数据库 MySQL 获取它们 只在会话数组中留下一个ID 还是直接将它们存储在会话数组中 是否更有效 而且性能方面的差异这么大吗 假设数据库有 100 000 行 考
  • 将 R 诊断消息发送到 stdout 而不是 stderr

    寻找一个选项可以让我重定向 R 诊断消息 由message to stdout not stderr因为它是默认的 message手册指出 默认处理程序将消息发送到 stderr 连接 那么问题是如何改变这种默认行为 仍然保留重定向warn
  • 从 json 文件中读取多个元素

    我有一个 json 文件 其中包含许多如下元素 code hfuiew89 type location coordinates lat 40 9861 lon 29 1046 index 1 lat 40 9976 lon 29 1153
  • GO111MODULE=on(加载模块要求时出错)

    go get u github com junegunn fzf工作正常 但想像这样测试开发分支 gert gert GO111MODULE on go get u github com junegunn fzf devel go find
  • 具有多个数据源的工作单元?

    有可能 甚至很可能 我只是没有完全理解 工作单元 的概念 基本上 我将其视为面向对象环境中使用的广泛事务 启动工作单元 与对象交互 提交或回滚 但这如何分解为这些对象背后的数据存储上的实际事务呢 在具有单个 DB 和 ORM 例如 NHib