繁体   English   中英

Asp.Net MVC3 Singleton变量

[英]Asp.Net MVC3 Singleton variable

有机会在asp.net mvc3中定义一些单例变量吗? 我想定义它(可能在global.asax中),然后在控制器中通过IOC解析器(structureMap)来获取它

简单:我想为所有用户提供一个具有相同数据的属性,而不是依赖于请求,会话等。例如,在MVC应用程序的第一次启动时,我将DateTime值设置为该属性,然后所有请求都可以查看该属性并对其进行修改控制器中的属性。

只需使用StructureMap使用依赖解决程序来创建您的控制器,如本博文中所述。 不直接注入变量,而是注入包含该变量的实例:

public class GlobalScope 
{
  public String Variable { get; set; }
}

现在,您可以将GlobalScope注入控制器中并设置/获取变量,但请记住,您处于多线程环境中,必须同步对变量的读写访问,否则您将遇到一些奇怪的竞争条件。

首先,您可以在.net中使用简单的单例模式,而这与asp.net或asp.net mvc完全无关。

如果您想使用IoC,则可以像单实例一样注册类实例,而IoC总是只返回单个类实例。 将必要的属性放入此实例并进行编辑。 初始化将在类型注册步骤中进行:

Autofac中的示例

builder.Register(MySingleton.Instance);

并使用惰性初始化:

builder.Register(c => MySingleton.Instance);

您还可以注册类型,并且IoC将控制您的类型初始化,但是在这种情况下,您无法在初始化期间设置默认值:

builder.RegisterType<MyType>().SingleInstance();

公共static的任何变量或类都驻留在AppDomain中,并且在所有会话中都可以全局使用。 因此,您可以简单地:

  • 在APP_CODE中创建一个称为“ CurrentApplication”的公共静态类,然后在所有会话中使用它。
  • 由于大多数IOC对象默认的Lifestyle是Singleton,因此IOC对此也非常有用,因此也位于AppDomain中。
  • 另一种方法是使用“公共服务定位器”

众所周知,可以使用这3种方法,包括使用通用服务位置来查找IOC容器,这使生活变得如此轻松。

希望这可以帮助

您可以将数据存储为Application类的静态成员。 请参阅本文-ASP.NET中的应用程序状态

您的IoC容器可能扩展了单例的概念。 Ninject使用InSingletonScope。 这将比静态应用程序变量更好,因为任何库都必须了解您的应用程序,然后才有了循环引用。

暂无
暂无

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

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