Asp.Net MVC3 Singleton变量

时间:2011-11-24 16:02:07

标签: c# asp.net asp.net-mvc-3

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

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

5 个答案:

答案 0 :(得分:4)

使用StructureMap创建控制器,使用this blog post中概述的依赖解析器。不直接注入变量,而是注入变量的实例:

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

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

答案 1 :(得分:1)

首先,您可以在.net中使用简单的单例模式,这与asp.net或asp.net mvc特定的东西无关。

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

Autofac中的示例:

builder.Register(MySingleton.Instance);

并使用Lazy初始化:

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

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

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

答案 2 :(得分:1)

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

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

众所周知,使用所有3个包括使用公共服务位置来查找IOC容器,这使生活变得如此简单。

希望这有助于

答案 3 :(得分:0)

您可以将数据存储为Application类的静态成员。请参阅此文章 - Application State in ASP.NET

答案 4 :(得分:0)

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