这个问题源于我问过太多接口、QCRS 和 Mediatr 库(请求/响应)的另一个问题
Mediatr:减少 DI 对象的数量 https://stackoverflow.com/questions/53966361/mediatr-reducing-number-of-died-objects?noredirect=1#comment94776378_53966361
我创建了一堆命令和查询,并且有很多行为,其中之一是缓存行为,对于每个查询,在针对数据库实际执行查询之前都会检查缓存的值。到目前为止,这工作得很好,但是当我有 UpdateSomethingCommand 时,delima 就会出现,一旦我更新数据库中的底层对象,我想用成功保存到数据库的内容刷新缓存。
我的问题是具体何时实际更新缓存:
- 在 Update Something CommandHandler 中(这可能会破坏 SOLID 原则)
- 在 UpdateSomethingCommandHanlder 中调用另一个专门用于更新缓存的命令(不确定这是一个好的设计原则)
- 引入另一种专门用于更新缓存的行为(尚不知道如何进行)
- 有更好的解决方案吗?
我们对使用 MediatR 的项目有类似的需求,最终将缓存合并到中介管道中,包括您所描述的缓存失效。
基本前提是我们在管道中插入了两种不同的行为,一种用于缓存来自请求的响应,另一种用于使来自不同请求的缓存请求响应无效。
这两种行为之间存在一些相互作用,因为它们需要交换缓存密钥以使正确的请求无效。
我最近将其中一些工作放入一个独立的库中,理论上可以将其按原样放入任何使用 MediatR 的项目中。对于您的情况,您可能只想查看我们在此使用的技术并根据需要重新创建它们。
我不会在这里重复所有内容,而是会向您指出项目页面,其中主页上的“入门”链接下有一些文档:https://github.com/Imprise/Imprise.MediatR.Extensions.Caching https://github.com/Imprise/Imprise.MediatR.Extensions.Caching
在我看来,缓存失效使整个过程变得非常简单和直接,但在某些情况下,我们需要对失效发生的时间进行更精细的控制。在这些情况下,我们采取的另一种方法是注入ICache<TRequest, TResponse> cache
into INotificationHandler
s,然后调用_cache.Remove(key);
根据需要手动。然后,从您知道应该无效的任何请求中,只需发出由INotificationHandler
e.g. _mediator.Publish(SomethingUpdated);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)