4

我可能会因阻抗不匹配而注定要失败,但我正在尝试协调我在 IRepository 和不可变对象中看到的示例。

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

同时,我们的数据团队不断更新产品数据——新图片、更新价格、描述等。

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

但是这个想法似乎与我看到的许多使用 Update/Delete 方法的 IRepository 示例不同——只要线程可以写入产品,似乎我就会对比赛和其他讨厌的事情敞开心扉。

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

这有道理吗?正如我所看到的那样,这可以与存储库一起使用吗?

4

2 回答 2

4

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

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

在产品更新的情况下,您需要确保通过工厂创建新产品。您的存储库将仅包括三种操作类型:检索(或查找)、保存和取代。Save 存储新产品的位置,该产品未更改。而取代将存储新产品,使旧产品无效并将其从缓存中清除。

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

void Save(Product product);

void Supersede(Product oldProduct, Product newProduct);

我希望这有帮助。

于 2009-04-15T12:21:28.310 回答
1

是否存在无法进行简单锁定(排他/悲观或乐观)的高并发或性能要求?

于 2009-04-15T12:20:10.827 回答