c# - 简单注入(inject)器的生活方式作为缓存解决方案

标签 c# .net caching dependency-injection simple-injector

我使用 Simple Injector 作为 IoC 容器来注入(inject)我的依赖项。目前有一组我依赖的主数据,构建此主数据的类被标记为单例,以避免频繁调用数据库。

但这给我带来了麻烦,因为我无法使新数据无效并反对。绝对时间缓存策略应该可以满足我当前的需求。

为了引入缓存,我可以想到以下方法

  1. 使用Decorator模式引入Caching层。
  2. 使用Interceptor引入缓存层。
  3. 使用 Lifestyle Hook 作为缓存解决方案(如 here 中所述)。

我更倾向于选择#3。

我想征求专家的意见,了解这是否是正确的方法以及除上述链接中提到的之外可能存在的陷阱。

最佳答案

您不应该创建自己的自定义生活方式,因为:

  • 这意味着您正在应用程序组件中缓存数据,这使它们成为有状态的,这是您应该努力避免的情况。使组件无状态可以简化开发,因为它可以更轻松地推理此类组件。
  • 正如您所指向的文档中已经指出的,给定的“绝对过期”生活方式可能会导致麻烦,因为“即使使用锁定来同步访问,此自定义生活方式也可能无法按预期工作,因为当过期时间在解析对象图时通过。”这样的问题可能很难解决。

我想说装饰器方法会产生最好的结果。这里装饰器不应该保存缓存本身(因为这会使其成为有状态和可变的,而是将其委托(delegate)给外部服务,例如 MemCache 或者绑定(bind)到请求或 session 的东西.

关于c# - 简单注入(inject)器的生活方式作为缓存解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42666263/

相关文章:

c# - 我可以将带有 C 风格方法的 C++ 接口(interface)导出到 C# dll 吗

.net - EF Core 添加迁移构建失败

c# - 什么情况下使用Application Domain?

java - Spring ehcache 未被使用

caching - 如何使用 UUID 配置 Redis 缓存以进行 session 管理

c# - 对于 .Net Native C# 应用程序,无法通过 WACK 测试并避免 ILT005 错误

c# - 调试混淆代码

c# - C#中的和弦?

c# - 如何使用 HttpClient 根据个人请求设置 HttpHeader

ruby - Merb 中的缓存最佳实践