Mediatr - 无效/更新缓存的正确位置在哪里

2024-01-04

这个问题源于我问过太多接口、QCRS 和 Mediatr 库(请求/响应)的另一个问题

Mediatr:减少 DI 对象的数量 https://stackoverflow.com/questions/53966361/mediatr-reducing-number-of-died-objects?noredirect=1#comment94776378_53966361

我创建了一堆命令和查询,并且有很多行为,其中之一是缓存行为,对于每个查询,在针对数据库实际执行查询之前都会检查缓存的值。到目前为止,这工作得很好,但是当我有 UpdateSomethingCommand 时,delima 就会出现,一旦我更新数据库中的底层对象,我想用成功保存到数据库的内容刷新缓存。

我的问题是具体何时实际更新缓存:

  1. 在 Update Something CommandHandler 中(这可能会破坏 SOLID 原则)
  2. 在 UpdateSomethingCommandHanlder 中调用另一个专门用于更新缓存的命令(不确定这是一个好的设计原则)
  3. 引入另一种专门用于更新缓存的行为(尚不知道如何进行)
  4. 有更好的解决方案吗?

我们对使用 MediatR 的项目有类似的需求,最终将缓存合并到中介管道中,包括您所描述的缓存失效。

基本前提是我们在管道中插入了两种不同的行为,一种用于缓存来自请求的响应,另一种用于使来自不同请求的缓存请求响应无效。

这两种行为之间存在一些相互作用,因为它们需要交换缓存密钥以使正确的请求无效。

我最近将其中一些工作放入一个独立的库中,理论上可以将其按原样放入任何使用 MediatR 的项目中。对于您的情况,您可能只想查看我们在此使用的技术并根据需要重新创建它们。

我不会在这里重复所有内容,而是会向您指出项目页面,其中主页上的“入门”链接下有一些文档:https://github.com/Imprise/Imprise.MediatR.Extensions.Caching https://github.com/Imprise/Imprise.MediatR.Extensions.Caching

在我看来,缓存失效使整个过程变得非常简单和直接,但在某些情况下,我们需要对失效发生的时间进行更精细的控制。在这些情况下,我们采取的另一种方法是注入ICache<TRequest, TResponse> cache into INotificationHandlers,然后调用_cache.Remove(key);根据需要手动。然后,从您知道应该无效的任何请求中,只需发出由INotificationHandler e.g. _mediator.Publish(SomethingUpdated);

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

Mediatr - 无效/更新缓存的正确位置在哪里 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Rails DB 中使用 CamelCase 代替 Snake_case

    我的数据库表和字段名称采用驼峰命名法 是否可以将这些名称即时转换为snake case 为了让模型方法看起来更漂亮 该应用程序是 JRubyOnRails 3 0 MSSQL DB ActiveRecord JDBC 适配器 arkadiy
  • 使用 scrapy 递归抓取网站

    我正在尝试使用 scrapy 废弃一个网站 这是我到目前为止编写的代码http thuongnh com building a web crawler with scrapy http thuongnh com building a web
  • 从可迭代对象创建字典

    从可迭代创建字典并为其分配一些默认值的最简单方法是什么 我试过 gt gt gt x dict zip range 0 10 range 0 但这不起作用 因为 range 0 不是可迭代的 因为我认为它不会是可迭代的 但我还是尝试了 那么
  • 使用 codeigniter 获取 $config['encrypt_name'] 之后的文件名

    无论如何 我是否可以在加密后获取文件的文件名 以便我可以将文件名保存到我的数据库中 config encrypt name TRUE 这种加密一般是改变镜像文件的文件名 我想知道如何获取它或将其保存到变量中 提前致谢 this gt 上传
  • 如何在没有index.html的情况下使用Jekyll-paginate?

    我正在尝试在 Github 页面上构建我的博客 出于显而易见的原因我必须使用 Jekyll paginate 问题是 除了欢迎页面之外 我不将 index html 页面用于任何其他用途 我在名为articles的文件夹中有一个名为inde
  • Varnish 和 ESI HTTP AUTH

    我对这个问题很迷茫 我不知道问题出在哪里 所以 我希望你能帮助我 我有 symfony 的 HTTP BASIC 身份验证 并且我正在尝试访问受此身份验证保护的 url 并在 Drupal 页面中使用标签 每个请求都会发送到 Varnish
  • 具有可扩展组的分组 Gridview

    关于嵌套网格视图或具有子网格视图的主题存在许多问题 我已经考虑过这种方法 但它对于我的目的来说太多了 我能找到的最接近的现有问题是这个 分组网格视图 https stackoverflow com questions 1804282 gro
  • 多线程Java

    我正在尝试在我的 Java Mandelbrot 应用程序中实现多线程 这是我到目前为止所拥有的 import java awt Color import java awt Graphics2D import java awt image
  • 多选 WinForms 列表框上的两种方式绑定?

    我有一个项目 我们正在从对象集合中加载多选列表框 我有另一个实体对象 它有一个集合 我想以某种方式绑定到 SelectedItems 有没有办法使用对象绑定源或某种绑定源来做到这一点 而无需编写代码 当然 我可以循环遍历集合并获取选定的项目
  • 在 IE8 中右键单击取消选择文本

    我希望用户从页面的文本区域中进行选择 我有一个上下文菜单 用户可以在右键单击所选内容时使用 这是我从 IE8 中的文本区域检索所选内容的代码 var textComponent document getElementById myTextA
  • 面向对象的 JavaScript:你会如何解决这个问题?

    随着我对 JS 的了解越来越深入 我已经从过程式风格转向半面向对象风格 不要问我这是什么意思 基本上一团糟 但现在我想开始正确使用它 OO 吸引了我的编码大脑 然而 我正在尝试开发一个学校周图书馆 但我不确定最好如何去做 如果我简单地使用一
  • 如何从故事板加载初始窗口控制器?

    我已经提出了很多问题 但没有一个问题能解答我的疑问 我正在尝试以编程方式加载初始窗口 这是我所做的 我已添加 main swift as import Cocoa private func runApplication applicatio
  • 如何关闭输入到 Response(jax.rs) 的InputStream

    GET Path id content Produces application octet stream public Response getDocumentContentById PathParam id String docId I
  • GROUP BY 和 ORDER BY [重复]

    这个问题在这里已经有答案了 可能的重复 SQL GROUP BY 中的 ORDER BY 总计 https stackoverflow com questions 2237918 sql order by total within grou
  • 如何在 Node 8 的 Node.js REPL 中导入 ES 模块?

    我有一个ES6 https en wikipedia org wiki ECMAScript 6th Edition E2 80 93 ECMAScript 2015 module right mjs 将其作为参数执行node效果很好 no
  • Laravel 5.1:将上传的文件保留为旧输入

    我正在使用 Laravel 5 1 中的表单来发布一些文本并上传文件 它看起来像这样 简化版 Form open array url gt foo bar Form text image name Form file image Form
  • Javascript - 如何将缓冲区转换为字符串?

    这是将 String 转换为 Buffer 再转换回 String 的示例 let bufferOne Buffer from This is a buffer example console log bufferOne Output
  • deviceready 不在科尔多瓦发射

    对于我的 cordova 项目 deviceready 未正确触发 至少在 iOS 中 我已经搜索了几个小时 但仍然无法弄清楚这一点 我做错了什么吗 js cordova js 的路径也存在
  • 如何在 ggplot2 R 中使用 sec_axis() 处理离散数据?

    我有如下所示的离散数据 height lt c 1 2 3 4 5 6 7 8 weight lt c 100 200 300 400 500 600 700 800 person lt c Jack Jim Jill Tess Jack
  • Mediatr - 无效/更新缓存的正确位置在哪里

    这个问题源于我问过太多接口 QCRS 和 Mediatr 库 请求 响应 的另一个问题 Mediatr 减少 DI 对象的数量 https stackoverflow com questions 53966361 mediatr reduc