首先,说到文件系统,在 Windows Server OS 上,磁盘上方有一个内置的缓存层。因此,对于磁盘读取,您可能不会有太大的不同。当然,一次又一次地解析相同的输入并不是一个好习惯,所以解析(tokenized)的xml应该被缓存。
设计需要更多说明:
是否只有一个 DAL 类实例,在 5 个服务之间共享?或者想法 1 中描述的属性是静态的?
在想法 2 中:当文件更改时,例如,连接字符串 4 更改(并且其他所有内容保持不变) - 只有服务 4 应该重新加载?
如果重新加载特定服务 - 它是否会导致与其他(非新鲜)服务的某种不一致?
更新:
我仍然不确定我是否完全理解这种情况,但据我所知,这是我要做的:
DAL 应该为所有与数据相关的操作公开一个接口。
假设它是IDataGateway
现在,每个服务都应该有一个对实现的实例的引用IDataGateway
。服务根本不应该知道缓存机制。它只是从接口消费数据。
因此,就类和代码组织而言,所有的缓存都是在服务之外完成的。
现在,缓存层反过来实现IDataGateway
了 ,并且还使用了 的非缓存实例IDataGateway
。这就是所谓的装饰者模式。非缓存实例将被注入到构造函数中。
现在,我建议每个服务都有自己的缓存实例IDataGateway
。它比单例更简单(至少对我而言)。而且由于数据不在服务之间共享,所以我们很酷。但是,如果数据在服务之间共享,则应使用单个实例。
回到这 5 个实例,然后回到 xml 文件。
我们希望在文件更改后对其进行监控,对吗?我们可以很容易地编写自己的文件监视器,或者使用框架自带的,或者我们可以查看 CacheDependency 类的源代码。
最简单的方法是让 5 个监视器监视同一个文件。这对性能的影响不大,因为计时器非常“便宜”。
但是,如果您想减少系统使用的资源,那么您可以使用单个监视器,让它引发它的事件FileChanged
或类似的东西。的 5 个缓存实现(这 5 个实例)中的每一个都IDataGateway
应该在其构造函数中注入此监视器,并将其自己的事件侦听器连接到FileChanged
事件。
一旦触发此事件,所有 5 个缓存实例都IDataGateway
将使其内部缓存无效,因此它们应清除其内存中的条目。
在下一次调用时, 的缓存实现IDataGateway
将尝试从其内存缓存中获取不存在的数据,但显然不会有任何数据,因此它应该继续在 的非缓存实现中执行相同的方法IDataGateway
,并填充它的缓存。
这是我的设计,HTH...