我正在构建一个Web系统,各个客户端将在整个站点中为默认实例提供备用文本。一个地方是主要的导航,但还有其他的。默认可能是“项目”,但他们可能想将其称为“事件”。
我正在开始调用所有术语设置(有一个大约15个列表)并创建一个ArrayList,它具有id,默认或替换为ArrayList中的项目。
我还有一个名为TermKey的枚举键列表,其中包含默认值和相应的ID号。
在整个代码中,我将引用TermKey.Project,然后执行其中一个我认为是选项的事情。 1 - 从会话中拉出文本(如果客户端已将其设置为“event”,则文本“event”将等待其中的调用) 每次我需要时,从数据库中提取文本。 每次页面加载时3 - 拉客户端列表。
对于每种方式的影响或者对于这种事情是否有最佳实践的一些想法将不胜感激。
答案 0 :(得分:2)
会话不是此类信息的最佳位置。虽然是,但它是用户绑定的,会话状态实际上是用户绑定的会话绑定信息的存储库。你似乎拥有的是真正具有超出会话范围的信息。
反映此信息的最佳方式是使用自定义ASP.NET Profile Provider。您将使用它来公开您需要公开的信息的属性,而属性中的逻辑将根据系统中的用户(或匿名用户,如果未经过身份验证)处理将值设置为适当的值。
在您的情况下,您可以根据需要在配置文件提供程序中缓存值并访问数据库。
然后,如果您使用的是ASP.NET MVC,则通过Profile property on the HttpContext class(以及Profile property on the HttpProfileBase class)公开此信息。
答案 1 :(得分:1)
无论如何,你不应该在每个页面上调用DB只是为了获得替代文本。我认为将它们存储在会话中是好的,如果它们不是太多(每个用户)
答案 2 :(得分:1)
我过去这样做的方法是拥有一个数据库类型代码表,然后是一个特定于客户端的转换表,如下所示:
TABLE ObjectType
ObjectTypeCode
TABLE ClientObjectTypeTranslation
ClientId
ObjectTypeCode
OverrideDescription
这允许我的代码始终引用我所知道的内容(即ObjectTypeCode),然后我在每个查询中加入到转换表,并在相关的位置显示覆盖描述。
尽管如此,这可能对你的情况来说有点过分了。
答案 3 :(得分:1)
如果您希望跨会话保持会话(并且它不是太多数据),则会话可以执行此操作。另一种选择是cookie。 我建议在会话启动时,在User对象属性中实例化会话变量,然后可以引用,User.DefaultText
答案 4 :(得分:0)
如果这是特定于每个用户,您也可以使用会话。不要过度使用(并且仅将其用于少量数据)。
针对每个请求访问数据库可能过度,特别是如果此数据不经常更改 - 从本地内存检索比从网络检索要快得多。
话虽如此,使用会话InProc会将您限制为单个服务器,并且不允许您扩展到Web场。