gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:45:10 24 4
gpt4 key购买 nike

在遵循领域驱动设计的应用程序中,您有以下几种概念

  • 处理数据库访问的存储库
  • 协调实体和值对象等之间的交互的应用服务。

  • 通常,您会将缓存代码放在哪里,以消除对数据库的昂贵调用?

    我看到代码库只是缓存在所有地方,很难监控内存使用情况,也很难为其他开发人员提供指导。

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

    最佳答案

    抽象存储库的美妙之处在于您可以使用 Decorator pattern实现诸如缓存之类的横切关注点。

    例如,给定一个 IMyRepository 接口(interface),您可以像下面的伪代码一样创建一个 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;
    }
    }

    在此示例中,GetFoo 由 IMyRepository 定义。请注意,仅在缓存未找到该项目时才调用修饰的存储库。

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

    在我们当前的项目中,我们使用了这种方法,而且更棒的是,我们可以在事后才考虑这样做,甚至无需触及原始存储库。这是 Open/Closed Principle 的精神.

    关于在域驱动设计中缓存代码位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2028747/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com