存储库和工作单元模式 - 如何保存更改

2024-04-05

尽管此类问题被问了很多次,但我仍在努力理解存储库和工作单元模式之间的关系。本质上我仍然不明白哪一部分将保存/提交数据更改 - 存储库还是工作单元?

由于我见过的每个示例都与将它们与数据库/或映射器结合使用有关,让我们制作一个更有趣的示例 - 让我们将数据持久保存到数据文件中的文件系统中;根据模式,我应该能够做到这一点,因为数据的去向无关。

因此对于一个基本实体:

public class Account
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我想会使用以下接口:

public interface IAccountRepository
{
     Account Get(int id);
     void Add(Account account);
     void Update(Account account);
     void Remove(Account account);
}

public interface IUnitOfWork
{
    void Save();
}

我认为就用法而言,它看起来像这样:

IUnitOfWork unitOfWork = // Create concrete implementation here
IAccountRepository repository = // Create concrete implementation here

// Add a new account
Account account = new Account() { Name = "Test" };
repository.Add(account);

// Commit changes
unitOfWork.Save();

请记住,所有数据都将保存到文件中,那么实际添加/更新/删除这些数据的逻辑在哪里?

  1. 它是否通过以下方式进入存储库Add(), Update() and Remove()方法?对我来说,将所有读取/写入文件的代码放在一个地方听起来很合乎逻辑,但是这样做的意义何在?IUnitOfWork界面?
  2. 它是否进入IUnitOfWork对于这种情况,哪个也负责数据更改跟踪?对我来说,这表明存储库可以读取文件,而工作单元必须写入文件,但逻辑现在分为两个地方。

存储库可以在没有工作单元的情况下工作,因此它也可以有 Save 方法。

public interface IRepository<T>
{
     T Get(int id);
     void Add(T entity);
     void Update(T entity);
     void Remove(T entity);
     void Save();
}

当您有多个存储库(可能有不同的数据上下文)时,使用工作单元。它会跟踪事务中的所有更改,直到您调用 Commit 方法将所有更改保存到数据库(在本例中为文件)。

所以,当你打电话时添加/更新/删除在存储库中,它仅更改实体的状态,将其标记为“已添加”、“已删除”或“脏”...当您调用 Commit 时,工作单元将循环遍历存储库并执行实际的持久化:

  • 如果存储库共享相同的数据上下文,工作单元可以直接使用数据上下文以获得更高的性能(在本例中打开并写入文件)。

  • 如果存储库具有不同的数据上下文(不同的数据库或文件),工作单元将在同一 TransactionScope 中调用每个存储库的 Save 方法。

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

存储库和工作单元模式 - 如何保存更改 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 自动滚动 JavaFX TextFlow

    我有一个 JavaFXTextFlow包裹在一个ScrollPane 我试图让它在有新内容时自动滚动到底部Text被添加到TextFlow 我尝试过附加监听器以最大化ScrollPane s vvalue to The ScrollPane
  • Rails 包含查询,其条件不返回左表中的所有结果

    我有两个表格 帖子和图像 以下是 schema rb 中的相关部分 create table posts force true do t t string name t string body t datetime created at t
  • 更新张量流中的张量切片

    我想更新 3 维张量的切片 下列的如何在 Tensorflow 中进行切片分配 https stackoverflow com questions 39157723 how to do slice assignment in tensorf
  • 我可以使用QTimer来实现多线程算法吗?

    目前我需要实现一个基于Qt的多线程算法 也许我应该尝试延长QThread 但在此之前 我想问一下 我是否可以只使用两个QTimers timer1 timer2 并将它们的超时信号分别连接到线程上 来实现一个 假 的多线程程序 您可以连接
  • WCF 中的两个接口和一个具体类

    请检查下面的示例 namespace GServices ServiceKnownType typeof SearchType ServiceContract SessionMode SessionMode Allowed public i
  • 组合两张地图

    Scala 中是否有一个函数可以组合两个映射 或者 flatMap 是一个明智的方法吗 scala gt val caps Map String Int Map A 1 B 2 caps Map String Int Map A gt 1
  • tinypng.org 如何压缩 PNG 文件? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 http tinypng org http tinypng org 是一项很棒的服务 他们将我的 png 图像优化了约 67 他们的服务如何运作 他们
  • React.js使用axios将数据发布到php,但php echo为空

    我正在使用react js axios和PHP将数据发布到MySQL数据库 这是我的react js代码 sendData var data new FormData data append name jessie data append
  • 如何开发依赖的 Composer 包而不需要提交或发布更改?

    我有一个应用程序 A 它有一个composer json 文件 定义了对包 P 的依赖关系 这是我自己的新闪亮包 我的包 P 有一个composer json 文件 它定义了对库 L 和框架 F 的依赖关系 我的包 P 还没有远程存储库 并
  • 如何在 Kubernetes 中模仿“--volumes-from”

    我正在寻找一种模式 允许在 Kubernetes 中同一 Pod 上运行的两个容器之间共享卷 我的用例是 我有一个 Ruby on Rails 应用程序在 Docker 容器内运行 docker 镜像包含静态资源 app
  • 如何使 RawPrinterHelper 同时在 XPS_PATH 和 RAW 数据类型中工作?

    我在用原始打印机助手 http support microsoft com kb 322091 en us用于打印 它可以在 Windows 7 及之前的版本上正常运行 当我们使用安装在 Windows 8 电脑上的打印机进行尝试时 它不起
  • 如何防止两个相同类型的管道 jenkins 作业在同一节点上并行运行?

    我不想允许同一类型 同一存储库 的两个作业在同一节点上并行运行 我怎样才能在 Jenkinsfile 中使用 groovy 来做到这一点 中提供的答案https stackoverflow com a 43963315 6839445 ht
  • Clojure 的 Atom 在 Scala 中相当于什么?

    Clojure 有一个原子 http clojure org atoms for 以同步且独立的方式改变线程之间的状态 http clojure org concurrent programming 这不是 STM 的一部分 https s
  • Chrome 开发者工具中资源的 status=canceled 是什么意思?

    什么会导致页面被取消 我有 Chrome 开发者工具的屏幕截图 这种情况经常发生 但并非每次都会发生 似乎一旦缓存了其他一些资源 页面刷新就会加载 LeftPane aspx 真正奇怪的是 这种情况只发生在 Google Chrome 中
  • 出现错误:write() 不接受关键字参数

    gd open gamedata py rb gd write CharHealth 100 gd close 我收到错误消息 write 不接受关键字参数 但我不明白为什么 我最好的解释是代码试图解释 CharHealth 100 作为关
  • 在 Visual Studio 中设置缩进样式?

    我有 2 个问题 Q1 我读过各种编码缩进样式 http en wikipedia org wiki Indent style如奥尔曼 K R 等 我想知道的是VS 2010 中的设置在哪里可以设置所有这些 Q2 当我按下Ctrl K an
  • 使用数组作为 CGridView 的数据源

    我希望这能起作用 我正在编写和开票应用程序 并希望将当前发票保存在一个数组中 该数组可以存放在 blob 字段中 这也将用于存档更改等 发票的销售项目使用CGridView 显示 唯一的事情是所有文档都说数据源应该是 IDataProvid
  • Android CameraX 如何实现广角/缩小

    我尝试使用以下方法为我的应用内相机实现广角选项CameraXapi 但遇到了一个问题 CameraControl setZoomRatio允许设置缩放范围ZoomState getMinZoomRatio and ZoomState get
  • Sublime Text 2 / Sublime Text 3 在 osx 上恢复未保存的文件

    在 Sublime 中 我知道即使您稍后不将更改保存在文件中 您也可以从上次停下的地方开始 我在 sublime 中打开了一个新选项卡 并在保存文件之前关闭了应用程序 sublime 是否在计算机中的某个位置保存临时文件 我使用的是 MAC
  • 存储库和工作单元模式 - 如何保存更改

    尽管此类问题被问了很多次 但我仍在努力理解存储库和工作单元模式之间的关系 本质上我仍然不明白哪一部分将保存 提交数据更改 存储库还是工作单元 由于我见过的每个示例都与将它们与数据库 或映射器结合使用有关 让我们制作一个更有趣的示例 让我们将