c# - 依赖注入(inject)和缓存类最佳实践

标签 c# .net dependency-injection unity-container

<分区>

我有一个项目,我想在其中对多个接口(interface)使用缓存。

最好的方法是什么?我有两个想法:

  1. 缓存类和非缓存类都将实现相同的接口(interface)

    public interface IFoo
    {
        object Get();
    }
    
    public class Foo : IFoo
    {
        public object Get()
        {
            // return something from datasource
            return null;
        }
    }
    
    public class FooCached : IFoo
    {
        private readonly IFoo fooService;
    
        public FooCached(IFoo fooService)
        {
            this.fooService = fooService;
        }
    
        public object Get()
        {
            // check cache and if empty load the value using fooService (Foo class) 
            return this.fooService.Get();
        }
    }
    
  2. 每个实现都有自己的接口(interface)(虽然在这种情况下它基本上是相同的,只是名称不同)

    public interface IFoo
    {
        object Get();
    }
    
    public interface IFooCached : IFoo
    {
    }
    
    public class Foo : IFoo
    {
        public object Get()
        {
            // return something from datasource
            return null;
        }
    }
    
    public class FooCached : IFooCached
    {
        private readonly IFoo fooService;
    
        public FooCached(IFoo fooService)
        {
            this.fooService = fooService;
        }
    
        public object Get()
        {
            // check cache and if empty load the value using fooService (Foo class) 
            return this.fooService.Get();
        }
    }
    

我个人更喜欢第一种方式。我不太喜欢这种情况下的接口(interface)继承,因为这两个类基本相同,只是实现略有不同,我觉得它们应该有相同的接口(interface)。

但是,由于我看不到使用 Unity 实现此目的的“简单”方法,我不确定这是否真的是最佳方法。 基本上我需要将 IFoo 解析为 FooCached,除了 FooCached 本身,我需要 Foo。 (我知道如何完成这项工作,例如使用命名注册并为 FooCached 指定 InjectionConstructor,但这可能超出了这个问题的范围)。 另一方面,第二个非常容易设置。

最佳答案

第一种方法很常见,很容易与现代 DI 框架集成,例如SimpleInjector(它有专门用于此的 RegisterDecorator 方法)。该模式称为 Decorator,非常方便,因为您的调用者类无需担心数据来自何处以及数据来自何处,而是直接在 DI 容器中配置所有内容。我建议即使没有 DI 也使用相同的模式,它也遵循开放/封闭原则:此类对修改关闭,但对扩展开放(通过链接装饰器)。

附言我不是 100% 确定如何使用 Unity 实现这一点,但您可以尝试在其中搜索装饰器模式实现。

关于c# - 依赖注入(inject)和缓存类最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459901/

相关文章:

c# - 在 C# 中管理时间序列

c# - Visual Studio 无法识别 Form.Designer.cs 文件

.net - msbuild 失败 : MSB3086, MSB3091 : "AL.exe", "resgen.exe"未找到

c# - 简单的 PhraseQuery 找不到任何结果

c# - 依赖注入(inject)容器?它有什么作用?

java - 来自 JAR 的 Spring 依赖注入(inject)

c# - 如何编写将分隔字符串转换为列表的通用扩展方法?

c# - 在 MongoDB 中添加对另一个文档的引用 | mongocsharpdriver

.net 剪贴板元数据(或 Skype 报价使用的任何内容)

java - 实例化每个范围/组的单例 - 陷入 Guice 依赖 hell