2013-04-26 60 views
2

我试图想出一个通用模型,用于将一些上下文数据与C#中的对象相关联。我建立了一个可以描述如下缓存系统......将上下文数据添加到共享对象

背后的故事 - >缓存是一个单独的实现,提供了“只读”访问经常要求是,我使用自定义的CMS实施的一部分信息为各种asp.net应用程序。我通过我编写的桌面应用程序更新数据,下次Web服务器加载缓存时,我的更改会反映给访问者。 我的缓存遵循以下...

  1. 每个对象都有一个唯一的ID

  2. 任何对象都可以与任何其他对象通过在关联表中定义的ID映射相关

  3. 无论存在多少个与特定对象的关联,只有该对象的一个​​实例被加载到缓存中。

例如...对象A可能会关联到对象C的集合。类似地,对象B也可以关联到对象C的集合。如果有人从对象A的实例请求一个ID为23的对象C,然后从对象B请求一个ID为23的对象C,则它们将得到对象C的相同实例的句柄。

我现在有一些数据添加到图片中,但数据本身不属于对象A,并且它本身不属于对象C.该数据与对象C.

  1. 我最初的想法特定对象A的关联信息:保持额外的数据从对象C分开,因为它不属于真正通过自身对象C。在对象A中维护这些信息并允许它在Dictionary中查找。我不喜欢用这种方法访问数据的方式。我宁愿通过对象C或派生类直接访问附加数据,以实现绑定和易用性。

  2. 我的第二个想法:从对象C创建一个派生类(称为对象D),它包含附加的上下文数据并提供易于访问的属性。这解决了绑定问题,并为我提供了我一直在寻找的易用性。这种方法的问题是,现在我的对象A引用了对象D的集合,我需要通过复制对象A的全部数据来打破上述模型,以便我可以附加一些额外的关联信息。

我真的想是继续具有对给定id只有一个对象C的实例,并追加了可以在适当的情况下很容易地访问一些上下文数据和属性。这可以做到吗?我也打开这里的任何其他建议!我希望我的解决方案具有通用性和可靠性,所以我可以将它忘掉,并且不需要经常回头寻找更好的解决方案。

+0

您如何看待'只有该对象的一个​​实例'?例如,五个列表都添加了同一个对象,并且有五个列表引用,但实际上“只有一个实例”。我们认为一样吗? – 2013-04-26 19:47:09

+0

@KenKin是的。如果高速缓存正在加载,并且有五个列表,每个请求添加同一个对象...第一次遇到该对象时,它将从数据库加载。对于以下四个列表,请求不会触及数据库,而是添加对现有实例的引用。 – lpdev 2013-04-26 21:07:04

+0

好的。但似乎你只是想为数据库创建一个本地缓存? – 2013-04-26 21:24:49

回答

0

我结束了我的第二个想法。对象D成为一种特殊类型的对象,具有它自己的属性/成员/方法,但也有一个返回对象C的属性。对象D必须实现一个特定的接口,以便通过我的缓存算法来识别。我更新了缓存系统,以确保如果属性返回的对象C已经被加载,那么将返回一个,而不是从db中加载额外的副本。

0

对象C实例应该拥有自己的数据。当然,您可以通过从缓存中检索对象(通过对象A或对象B)将“路径”存储在其中,但将此类信息存储在对象中会修改对象,因此如果要检索对象通过另一个“路径”,信息将被覆盖。

一个解决方案可能是克隆对象C每次从缓存中检索并存储您的“路径”,或存储额外的数据,如果它通过对象A?

这样,缓存中的所有对象都按请求共享,但在缓存外独立一次。