【问题标题】:Who can see my Singleton?谁能看到我的单身人士?
【发布时间】:2016-03-19 13:02:30
【问题描述】:

我有一个 n 层应用程序。前端是一个 MVC 站点(如果有区别的话)。 MVC 站点、业务逻辑和 DAL 都可以访问特定的共享 DLL,其中定义了 Singleton 类。

这一切正常,就好像我在 DAL 中为 Singleton 的属性 Bar 分配了一个值“foo”,前端在访问 Bar 时会看到“foo”。

问题是,还有什么else可以看到Singleton?如果其他用户登录到我的 MVC 应用程序并且该页面的页面将Bar 属性设置为“Fred”。当我的第一个用户访问Bar 时会看到什么。

单例真的是该类的唯一实例吗?或者它是给定用户该类的唯一实例?

如果第一个用户在同一个应用程序的浏览器中打开另一个窗口怎么办?如果他导致Bar在一个窗口中更改,是否在另一个窗口中更改?

【问题讨论】:

  • 如果你正确地实现了单例,那么单个实例应该在整个 AppDomain 中可见。但不能知道,因为你没有发布任何代码。

标签: c# asp.net-mvc scope singleton


【解决方案1】:

问题是,还有什么可以看到Singleton?如果其他用户 登录到我的 MVC 应用程序和该页面设置栏的页面 “弗雷德”的财产。我的第一个用户在访问 Bar 时会看到什么。

所有用户都看到最后一个值。 (在您的示例中为“Fred”)

单例真的是该类的唯一实例吗?或者它是 给定用户的该类的唯一实例?

它是跨线程的类的唯一实例。如果您的 Web 应用程序在多个工作线程中运行,您将拥有多个实例。

如果第一个用户在浏览器中打开另一个窗口怎么办? 同一个应用程序?如果他导致 Bar 在一个窗口中更改,是 另一个变了?

当您谈论“Web 应用程序”时,“窗口”一词并不是那么好。每个窗口都是由一个请求创建的。并且每个请求都可以更改您的单例对象值。

【讨论】:

  • 好的。考虑到有没有像单例一样只实例化一次但范围更有限的结构?只限于当前用户?我最初的想法是用我的 sigleton 做我正在做的事情,但将数据保存在会话中。或者将其保存在使用会话密钥键入的 Singleton 中。
  • 你应该使用Session。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多