我有一个项目,我想在几个接口上使用缓存。
最佳方法是什么?我有两个想法:
缓存和非缓存类都将实现相同的接口
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();
}
}
每个实现都有自己的接口(虽然在这种情况下它基本上只是具有不同名称的接口)
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();
}
}
我个人更喜欢第一种方法。在这种情况下,我不太喜欢接口继承,并且因为这两个类基本上只是略有不同的实现,所以我觉得它们应该具有相同的接口。
但是,因为没有" easy"我可以看到使用Unity实现这一目标的方式,我不确定这是否真的是最好的方法。 基本上我需要解决IFoo到FooCached,除了FooCached本身,我需要Foo。 (我知道如何使用这个工作,例如使用命名注册并为FooCached指定InjectionConstructor,但这可能超出了这个问题的范围)。 另一方面,第二个很容易设置。
答案 0 :(得分:2)
第一种方法相当普遍,很容易与现代DI框架集成,例如SimpleInjector
(它完全具有RegisterDecorator
方法)。该模式称为Decorator,非常方便,因为您的调用者类不需要担心数据的来源和方式,但您可以直接在DI容器中配置所有内容。即使没有DI,我建议使用相同的模式,它也遵循开放/封闭原则:此类关闭以进行修改,但是可以打开扩展(通过链接装饰器)。
P.S。我不是100%确定Unity如何实现这一点,但您可以尝试在那里搜索装饰器模式实现。