繁体   English   中英

静态集合和asp.net

[英]Static collection and asp.net

我正在开发一个通用层,该层允许我执行基本的保存,删除和加载操作,但是遇到了我也不知道答案的问题,并立即想到了StackOverflow。

我有一个asp.net应用程序,该应用程序引用了一个单独的项目(包含我所有类定义的业务层)。 我的一个类(ObjectFactory)负责实例化对象并将它们存储在静态字典中(私有)。 这样的想法是,如果它已经被实例化,它将从静态集合中检索其定义。 我之所以选择这样做,是因为我只想一次获取一个类的propertyinfo [],根据Joel Pobar的MSDN文章所述,获取此信息非常昂贵。

我的问题是,尽管asp.net项目引用了包含我所有业务逻辑的类库,但此静态集合是否可以在全球使用? 例如,如果两个用户同时在我的网站上并访问我的网站的两个独立部分,其中涉及实例化两个独立的对象,ObjectFactory中的缓存将包含这两个项目吗? 还是基于每个用户的静态集合,即静态集合将仅包含特定用户的项目?

由于我的业务层无权访问Web缓存,因此我不确定是否要使我的业务层引用System.Web,然后将其插入其中?

抱歉,我可能对任何人都感到困惑,但也很乐意在需要时提供更多信息。

在此先感谢,Onam。

存储在静态变量中的对象在整个App Domain中共享。 所有线程(所有Web请求)将使用相同的值。 这意味着这些对象必须是线程安全的,否则您将走向失败,并且-当然-这只会在您投入生产后才会失败,因为这些问题通常不会在开发过程中显示出来,并且通常不会出现在开发过程中。也要分阶段进行(通常没有人在那个时候真正地测试您的系统)。

除了@Steven的答案外,我还要补充一下,每次应用程序池回收时,静态集合都会被清空,而且如果您最终在多台服务器上运行,则每个服务器都将拥有自己的集合。

因此,除了使字典线程中的项目安全之外,还应使用ConcurrentDictionary及其GetOrAdd和AddOrUpdate方法来确保对字典本身的线程安全访问,而不是普通的Dictionary类,后者不是线程安全的。

在给定的应用程序生命周期内,常规静态字段可用于所有线程。

无论如何,使用静态字段时要小心。 请注意以下事实:常规Dictionary<TKey, TValue>不是线程安全的。

您将需要在执行任何写操作(添加,删除...)时考虑阻止其他线程进入字典,否则将出现同步问题(例如,属性的反映信息可能被添加两次或更多) - )。

暂无
暂无

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

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