缓存存储库,域或应用程序的问题?

Fix*_*xer 12 c# design-patterns domain-driven-design repository-pattern

我试图找出哪个层应该负责域驱动设计项目中的缓存(插入/删除)工作.目标是通过缓存从存储库中检索的任何实体来提高Web应用程序的性能.

我的解决方案分为以下几种:

MyApp.Infrastracture
MyApp.Repositories
MyApp.Domain
MyApp.WebApplication
Run Code Online (Sandbox Code Playgroud)

我觉得因为它只是利用缓存的Web应用程序,那么缓存逻辑应该应该是这个层吗?然而,这并不正确,因为我希望保持Web应用程序的轻量级并专注于提供网页.

此外,缓存不是一流的域概念,因此在Domain层中不具有自然的适应性.

该怎么办?

Ode*_*ded 11

这是上述所有问题.

缓存是每个层需要单独处理并且应用程序需要协调的交叉问题之一.


Seb*_*ood 5

你注意到了

目标是通过缓存从存储库中检索的任何实体来提高Web应用程序的性能.

所以我认为你应该在你的存储库中透明地实现它.存储库旨在隐藏域中持久性的详细信息,如果要缓存大型对象以提高性能,那么域应该更加明智.您的存储库必须变得更加智能,可能跟踪同一对象的多个副本作为并行线程请求对象并同时改变它们.或者 - 如果可能 - 序列化对各个聚合根的访问,因为它们表示事务边界.

正如@Oded指出的那样,缓存确实可以在任何地方发生,如果性能有问题,你很可能会发现自己在许多地方实现缓存,并且每个地点都可能采用不同的方式.例如,您可以在域中缓存某些查询的结果,也可以缓存整个HTML响应.

跨层协调是因为缓存可能是一个非常漏洞的抽象.如果您的域对象被缓存,它们什么时候应该被缓存?如果一个线程使用缓存对象而另一个不使用缓存对象怎么办?如果您正在缓存查询结果,但基础对象已经改变了怎么办?从基础架构角度和业务角度来看,何时无效以及如何使无效是困难的问题.过时的查询并不总是坏的.