在域驱动设计中缓存代码位置

Dow*_*pel 6 dns caching domain-driven-design

在遵循域驱动设计的应用程序中,您可以使用以下类型的概念

  1. 处理DataBase访问的存储库
  2. 应用服务,协调enties和值对象之间的交互等.

通常你会把缓存代码放到一个昂贵的数据库调用?

我已经看到代码库只是缓存在整个地方,很难监控内存使用情况,很难为其他开发人员提供指导.

请理解我知道您应该只在需要时缓存数据,我只是问一般问题.

Mar*_*ann 10

抽象存储库的精彩之处在于,您可以使用Decorator模式来实现缓存等交叉问题.

例如,给定一个IMyRepository接口,您可以像这个伪代码一样创建一个MyCachingRepository:

public class MyCachingRepository : IMyRepository
{
    private readonly IMyRepository repository;

    public MyCachingRepository(IMyRepository repository)
    {
        if(repository == null)
        {
            throw new ArgumentNullException("repository");
        }

        this.repository = repository;
    }

    public Foo SelectFoo(int id)
    {    
        Foo foo = ... // attempt to get foo from cache

        if // foo is not it cache
        {
            foo = this.repository.SelectFoo(id);
            // save foo in cache
        }
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,GetFoo由IMyRepository定义.请注意,如果缓存找不到该项,则仅调用装饰的存储库.

这遵循Single Resposibility Principle,因为真正的缓存实现可以专注于检索和保存数据,而缓存装饰器可以专注于缓存.这使您可以彼此独立地改变两者.

在我们当前的项目中,我们使用了这种方法,更令人感到特别的是,我们可以在事先没有触及原始存储库的情况下做到这一点.这是开放/封闭原则的精神.