繁体   English   中英

用于存储参考类型的C#参考集合

[英]C# reference collection for storing reference types

我喜欢实现一个集合(类似于List<T> ),该集合将保存我在应用程序的整个生命周期中创建的所有对象,就好像它是C ++中的指针数组一样。 这个想法是,当我的过程开始时,我可以使用中央工厂来创建所有对象,然后定期验证/使它们的状态无效。 基本上,我想确保我的进程仅处理有效实例,并且不重新获取已经从数据库中获取的信息。 因此,我所有的对象基本上都将放在一个地方-我的收藏集。 我可以做的一件很酷的事情是避免数据库调用(如果我已经从数据库中获取数据的话)(即使我在检索到它的最新数据之后进行了更新,当然,如果其他进程没有更新它,但是另一种关注)。 我不想打电话给new Customer("James Thomas"); 再说一次,如果我在过去的某个时候曾向詹姆斯·托马斯(James Thomas)致意。 目前,我最终将在整个应用程序域中获得同一对象的多个副本-有些不同步,而其他则同步,即使我使用MSSQL服务器上的timestamp字段处理此问题,我也希望每个客户仅保留一个副本appdomain(如果可能,过程会更好)。

例如,我不能使用诸如List或ArrayList之类的常规集合,因为我无法通过参数的实际局部引用将参数传递给使用ref创建它们的现有Add()方法,因此我认为这不好。 那么如何实现/完全可以实现呢? 我现在想的是“链表”类型的类,其中所有方法都使用refout params进行处理,但可能很快就会变得丑陋。 还有另一种方法来实现这样的集合,例如RefList<T>.Add(ref T obj)吗?

因此,最重要的是:如果我在整个应用程序生命周期中都没有创建过对象,那么我不希望重新创建它,除非我决定明确地重新创建它(也许它是过时的,所以我有再次从数据库获取它)。 也许有其他选择吗?

完成您要完成的工作的最简单方法是创建一个保存列表的包装器。 该包装器将具有添加引用的add方法。 在添加中,它在列表中查找值,并在找不到值时创建它。 或缓存

但是...这句话会让我担心。

如果我在整个应用程序生命周期中都已创建过对象,则我不想重新创建它

但是正如雷蒙德·陈(Raymond Chen)指出的那样, 策略错误的缓存是内存泄漏的另一个名称 您所描述的是没有策略缓存

要解决此问题,您应该考虑为非Web应用程序使用System.Runtime.Caching for 4.0或3.5和更早版本的Enterprise Library Caching Block 如果这是一个Web App,则可以使用System.Web.Caching 或者,如果您必须自己动手,至少要制定明智的政策。

所有这些当然都假定数据库的缓存不足。

使用Ioc将为您节省许多许多错误,并使您的应用程序更易于测试,并且模块之间的耦合也会减少。 IOC的性能还不错。 我建议您使用Castle项目的实现http://stw.castleproject.org/Windsor.MainPage.ashx

也许您需要一天来学习它,但这很棒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM