C# 简易喷油器';s生活方式作为缓存解决方案

C# 简易喷油器';s生活方式作为缓存解决方案,c#,.net,caching,dependency-injection,simple-injector,C#,.net,Caching,Dependency Injection,Simple Injector,我使用SimpleInjector作为IoC容器来注入依赖项。目前,我所依赖的是一组主数据,构建此主数据的类被标记为singleton,以避免频繁调用DB 但这给我带来了麻烦,因为我无法使新数据无效,无法反对新数据。绝对时间缓存策略应该足以满足我当前的需要 为了引入缓存,我可以想到以下方法 使用Decorator模式引入缓存层 使用拦截器引入缓存层 使用生活方式挂钩作为缓存解决方案(如上所述) 我更倾向于选择#3 我想就这是否是正确的方法以及除了上述链接中提到的陷阱之外可能存在的陷阱获得专家意见

我使用SimpleInjector作为IoC容器来注入依赖项。目前,我所依赖的是一组主数据,构建此主数据的类被标记为singleton,以避免频繁调用DB

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

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

  • 使用Decorator模式引入缓存层
  • 使用拦截器引入缓存层
  • 使用生活方式挂钩作为缓存解决方案(如上所述)
  • 我更倾向于选择#3


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

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

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

    我要说的是,装饰方法将产生最好的结果。在这里,装饰程序不应该保存缓存本身(因为这将使它成为有状态的和可变的,但是将其委托给外部服务,比如
    MemCache
    ,或者可能是绑定到请求或会话的东西。

    谢谢@steven。我非常喜欢阅读文档,简单注入器的设计考虑。非常感谢。