存储库和不可变对象?

时间:2009-04-15 12:15:32

标签: immutability irepository

我可能注意到阻碍不匹配,但我正在努力调和我在IRepository和不可变对象中看到的例子。

我正在开发一个编目应用程序,其中Web请求的hundrds在一组“工作集”上运行 - 整个目录的一个子集在任何给定时间都会发挥作用。

与此同时,我们的数据团队不断更新产品数据 - 新图像,更新价格,描述等。

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

但是这个想法似乎打破了我用Update / Delete方法看到的许多IRepository示例 - 只要一个线程可以写入产品,就好像我打开了自己的种族和其他肮脏。

因此,我设想了一个“编辑器”模型,其中实体的更改是通过伴随的“编辑器”对象进行的,然后该对象会持续存在更改并强制重新加载有问题的产品供所有人使用。产品永远不会改变 - 只能在外部“编辑”并重新加载。

这有什么意义吗?如我所见,它可以用于存储库吗?

谢谢你的时间!

2 个答案:

答案 0 :(得分:4)

存储库仅负责数据检索/存储。工厂负责创建新对象。

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

如果产品更新,您需要确保通过工厂创建新产品。您的存储库只包含三种操作类型:Retrieve(或Find),Save和Supersede。 Save存储新产品,但不会更改。并且Supersede将存储新产品,使旧产品无效并从缓存中清除它。

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

void Save(Product product);

void Supersede(Product oldProduct, Product newProduct);

我希望这会有所帮助。

答案 1 :(得分:1)

是否存在如此高的并发或性能要求,您无法进行简单锁定,无论是排他/悲观还是optimistic