2009-04-15 63 views
4

我可能注定要阻止不匹配,但我试图调和我见过的IRepository和不可变对象的例子。存储库和不可变对象?

我工作的编目应用程序,其中Web请求的hundrds上的产品“工作集”操作 - 整个目录的一个子集往往是发挥在任何给定的时间。

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

在我看来,对于表现我最好考虑产品为永恒不变。它们由存储库加载并缓存,并且许多线程可以同时访问同一个产品对象。

但是这个想法似乎与许多我看到的更新/删除方法中的IRepository示例有关 - 只要一个线程可以写入产品,就好像我打开了自己的比赛和其他nastiness。

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

这是否有意义?我可以看到他们描述的这个可以使用存储库吗?

谢谢你的时间!

回答

4

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

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

在产品更新的情况下,你需要确保你通过工厂创建一个新的产品。您的存储库仅包含三种操作类型:检索(或查找),保存和取代。在哪里保存一个新产品,这是没有改变。 Supersede会存储新产品,使旧版无效并从缓存中清除它。

在C#签名的方面,我能想象两种存储方式采取以下外观:

void Save(Product product); 

void Supersede(Product oldProduct, Product newProduct); 

我希望这有助于。

+0

也许这与由迈克尔·哈伦建议的“编辑锁定”是要走的路 - 非常感谢! – n8wrl 2009-04-15 12:55:59

1

是否有如此高的并发性或性能要求,你不能做简单的锁定,无论是独家/悲观或optimistic