有机会在asp.net mvc3中定义一些单例变量吗? 我想定义它(可能在global.asax中),然后在控制器中通过IOC解析器(structureMap)获取它
简单:我想要为所有用户提供一个具有相同数据的属性,而不是依赖于请求,会话,...例如,首先启动MVC应用程序我将DateTime值设置为此属性,然后所有请求都可以查看此属性并在控制器中修改此属性。
答案 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中,并且可在全局会话中使用。所以你可以简单地说:
众所周知,使用所有3个包括使用公共服务位置来查找IOC容器,这使生活变得如此简单。
希望这有助于
答案 3 :(得分:0)
您可以将数据存储为Application类的静态成员。请参阅此文章 - Application State in ASP.NET
答案 4 :(得分:0)
您的IoC容器可能扩展了单例的概念。 Ninject使用InSingletonScope。这比静态app变量更好,因为任何库都必须知道你的应用程序,然后你有循环引用。