代码之家  ›  专栏  ›  技术社区  ›  n8wrl

存储库和不可变对象?

  •  4
  • n8wrl  · 技术社区  · 17 年前

    我可能会因为阻抗不匹配而命中注定,但我正试图调和我所看到的关于I假定对象和不可变对象的例子。

    我正在开发一个编目应用程序,其中成百上千的web请求在一个“工作集”的产品上运行——整个目录的一个子集往往在任何给定的时间都在发挥作用。

    同时,我们的数据团队不断更新产品数据——新图像、更新定价、说明等。

    在我看来,就性能而言,我最好将产品视为不变的。它们由存储库加载和缓存,许多线程可以同时访问同一个产品对象。

    但是这个想法似乎被我见过的许多更新/删除方法的正面例子打破了——只要一个线程能够写入一个产品,我就好像向种族和其他肮脏的事物敞开了大门。

    因此,我设想了一个“编辑器”模型,其中通过一个配套的“编辑器”对象对实体进行更改,然后该对象将这些更改持久化,并强制重新加载相关产品以供所有人使用。产品从不更改-仅在外部“编辑”并重新加载。

    这有什么意义吗?正如我所描述的那样,这能与存储库一起工作吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   grover    17 年前

    在您的情况下,不可变对象是可以的。但是,您需要一些方法来使超级种子产品无效并将其从存储库缓存中删除。在大多数情况下,任何悬空引用都可以忽略,因为它们在检索时是有效的。

    在产品更新的情况下,您需要确保通过工厂创建新产品。您的存储库只包含三种操作类型:检索(或查找)、保存和替换。其中Save存储一个新产品,该产品不会更改。“取代”将存储新产品,使旧产品无效,并将其从缓存中清除。

    就C#签名而言,我可以想象两种存储方法的外观如下:

    void Save(Product product);
    
    void Supersede(Product oldProduct, Product newProduct);
    

    我希望这有帮助。

        2
  •  1
  •   shsteimer    17 年前

    是否存在这样高的并发性或性能要求,以至于您无法执行简单的锁定,无论是独占/悲观还是非独占 optimistic

    推荐文章