C# ASP.NET MVC中全局使用的对象

C# ASP.NET MVC中全局使用的对象,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我希望在启动应用程序时实例化一个类,然后在每个类中使用该对象(自定义ValidationAttributes、控制器等) 我应该在哪里实例化该类,以便在任何地方都可以访问它 我将ASP.NET MVC与C结合使用。您可以将其作为MVCAPApplication类(global.asax)的静态属性,并在Application_Start中实例化。我将此类对象实例放在HttpRuntime缓存中 public static MyCacheHelper { public static MyT

我希望在启动应用程序时实例化一个类,然后在每个类中使用该对象(自定义
ValidationAttribute
s、控制器等)

我应该在哪里实例化该类,以便在任何地方都可以访问它


我将ASP.NET MVC与C结合使用。

您可以将其作为MVCAPApplication类(global.asax)的静态属性,并在Application_Start中实例化。

我将此类对象实例放在HttpRuntime缓存中

public static MyCacheHelper
{
    public static MyType GetMyInstance
    {
        get
        {
            if (HttpRuntime.Cache[MY_CACHE_KEY] == null)
            {
                HttpRuntime.Cache[MY_CACHE_KEY] = new MyType();
            }
            return (MyType)HttpRuntime.Cache[MY_CACHE_KEY];
        }
    }
}

听起来你想创建一个单例类。有很多关于如何实现这一点的例子,以及它们的注意事项。从本文中可以看出,这可能是创建单例的最简单方法:

public sealed class Singleton
{
    private static readonly Singleton instance = new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    private Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
} 

在代码中需要访问类的任何地方,都可以编写
Singleton.Instance.MyMethod()
(遵循上面的示例),就像访问
string.IsNullOrEmpty()
。除了上面包含的boiler plate代码之外,您还可以像编写任何其他类一样对属性和方法进行编码。

除了已经给出的选项之外,您还可以使用依赖项注入器来控制昂贵对象的管理和生存期,还可以很好地使用asp.net mvc。

是否有其他不涉及
静态的选项
?如果您希望跨其他类重用单个实例,静态是唯一的选择。我不知道你还想怎么做……你应该知道,如果你把这个对象设为真正的全局对象,它将在应用程序的所有用户之间共享。因此,如果您修改它的状态,您将在并发性方面遇到很多问题。如果它是一个“只读”对象,那么你就可以了。是的,我完全知道,这个对象对我来说就像一个迷你数据库。我希望我设法使它完全线程安全。这会在所有用户之间共享吗?