以我的经验,缓存是在某个层完成的 - 您正在缓存的内容适用于该层的范围,因此:
- 您可以在 DAL 中缓存数据,以便 DAL 从内存中返回数据,而不是再次访问数据库;所以在这里我们在数据级别缓存“原始”数据。
- BL 可能会缓存类似的数据(比如 POCO)——换句话说,已经应用了 BL 的“逻辑”数据;所以这里我们在 BL 级别缓存 BL 数据。
- 您的 UI 可能会缓存(您猜对了)在 UI 层构建的信息——例如将数据表示为网页、XML 等。
当您查看缓存时,作为系统的架构师/设计师,您将决定哪些东西值得缓存,通常这将由平衡需求驱动:
- 性能需要达到特定目标。
- 您有什么时间(和成本)选项。
假设我们正在缓存以提高性能,您将需要分析您的系统并确定需要消除或避免的瓶颈 - 此分析的第一遍至少应该确定首先关注哪一层。
要考虑的另一件事是,您可以在更靠近消费者的地方缓存更多 - 需要进行的整体处理就越少;换句话说,如果你可以在 UI 层缓存,那么 BL 和 DAL 层甚至都不会被查看(你不需要在那里添加缓存)。
在这一点上,我想问你,你想要达到的究竟是什么。
虽然我所说的一切都是真实的(据我所知),但这一切都是基于我们正在提供系统功能的“垂直”切片的假设(如“创建发票”、“添加产品”等) ; 您可以应用另一种模型——横切关注点模型。
想想像日志这样的东西——系统的每个部分(UI / BL / DAL)都应该能够记录系统事件;我最喜欢的工具是 MS Enterprise Libraries (MSEntLibs)。当我和他们一起工作时,我认为他们是一个“黑匣子”——一个独立的单元。我(通过选择)不知道它们是如何构建的——重要的是它们是孤立的并且具有相对容易管理的依赖关系。
MSEntLibs 可以记录到数据库,但如果我直接从我的 UI 调用 MSEntLibs 记录方法(记录到数据库)(并跳过我的 BL),我不在乎。
因此,根据您要执行的操作,正确的答案将是:
- 只需确定需要缓存的内容,让适当的层处理它。
- 您根本不需要尝试使用 DI 将东西传递给您的 BL - 横切黑盒组件可能合适吗?