我正在尝试提出一个通用模型,用于将一些上下文数据与C#中的对象相关联。我已经建立了一个缓存系统,可以描述如下......
背景故事 - >缓存是一个单独的实现,它提供对经常请求的信息的“只读”访问,这是我用于各种asp.net应用程序的自定义CMS实现的一部分。我通过我编写的桌面应用程序更新数据,下次Web服务器加载缓存时,我的更改会反映给访问者。 我的缓存遵循以下内容......
每个对象都有唯一的ID
任何对象都可以通过关联表中定义的id映射与任何其他对象关联
无论存在多少与特定对象的关联,该对象的只有一个实例会加载到缓存中。
例如......对象A可能与对象C的集合相关联。类似地,对象B也可以与对象C的集合相关联。如果要从对象A的实例请求ID为23的对象C,然后从对象B请求ID为23的对象C,则它们将获得对象C的同一实例的句柄。
我现在有一些数据要添加到图片中,但数据本身不属于对象A,它本身不属于对象C.数据是特定于对象A与对象C的关联的信息。
我的第一个想法:将附加数据与对象C分开,因为它实际上并不属于对象C.在对象A中维护此信息并允许在字典中查找它。我不喜欢这种方法中访问数据的方式。我希望通过对象C或派生类直接访问其他数据,以达到绑定和易用性。
我的第二个想法:从对象C(称为对象D)创建一个包含附加上下文数据的派生类,并提供易于访问的属性。这解决了绑定问题,并为我提供了我一直在寻找的易用性。我对这种方法的问题是,现在我的对象A指的是对象D的集合,我需要通过复制对象A的整个数据来打破我的上述模型,以便我可以附加一些额外的关联信息。
我真正想要的是继续只为给定的id提供一个Object C实例,并附加一些可以在适当的上下文中轻松访问的上下文数据和属性。可以这样做吗?我也愿意接受其他任何建议!我希望我的解决方案具有通用性和完善性,因此我可以忘记它,而不是不断寻求更好的解决方案。
答案 0 :(得分:0)
Objec C实例应该拥有自己的数据。当然你可以通过从缓存中检索对象的内容(通过对象A或对象B)存储“路径”,但是将这种信息存储在对象中,修改对象,如果要检索它通过另一条“路径”,信息将被覆盖。
解决方案可能是每次从缓存中检索对象C并将“路径”存储在其中,或者如果它来自对象A,则存储额外数据?
这样,缓存中的所有对象都会按照请求进行共享,但只能在缓存外部进行一次。
答案 1 :(得分:0)
我结束了第二个想法。对象D成为一种特殊类型的对象,它具有自己的属性/成员/方法,但也有一个返回对象C的属性。对象D必须实现一个特定的接口,由我的缓存算法识别。我更新了我的缓存系统,以确保如果已经加载了属性返回的对象C,则返回该对象而不是从数据库加载其他副本。