依赖注入和缓存类最佳实践

时间:2017-02-25 18:22:23

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

我有一个项目,我想在几个接口上使用缓存。

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

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

    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. 每个实现都有自己的接口(虽然在这种情况下它基本上只是具有不同名称的接口)

    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();
        }
    }
    
  3. 我个人更喜欢第一种方法。在这种情况下,我不太喜欢接口继承,并且因为这两个类基本上只是略有不同的实现,所以我觉得它们应该具有相同的接口。

    但是,因为没有" easy"我可以看到使用Unity实现这一目标的方式,我不确定这是否真的是最好的方法。 基本上我需要解决IFoo到FooCached,除了FooCached本身,我需要Foo。 (我知道如何使用这个工作,例如使用命名注册并为FooCached指定InjectionConstructor,但这可能超出了这个问题的范围)。 另一方面,第二个很容易设置。

1 个答案:

答案 0 :(得分:2)

第一种方法相当普遍,很容易与现代DI框架集成,例如SimpleInjector(它完全具有RegisterDecorator方法)。该模式称为Decorator,非常方便,因为您的调用者类不需要担心数据的来源和方式,但您可以直接在DI容器中配置所有内容。即使没有DI,我建议使用相同的模式,它也遵循开放/封闭原则:此类关闭以进行修改,但是可以打开扩展(通过链接装饰器)。

P.S。我不是100%确定Unity如何实现这一点,但您可以尝试在那里搜索装饰器模式实现。