如何创建一个可在所有MVC和MV中访问的全局对象? WEB API启动后从文件加载信息

时间:2015-02-03 19:04:00

标签: c# singleton global-asax

我有一个类,其中包含从App_Data本地XML加载的字典。我应该在哪里添加该类以使其全局并且对应用程序中的所有控制器可见?我只是一个表现得像单身人士的人。如果是在global.asax中添加它的好选项

类示例

  public class OptionsNames
        {
            private Dictionary<int, string> names;

            public OptionsNames()
            {

                names = new Dictionary<int, string>();

                names= LoadOptionsFromXML();

            }

            public string GetNameById(int id)
            {
                if (names.ContainsKey(id))
                     return names[id];

                return string.Empty;
            }
        }

2 个答案:

答案 0 :(得分:2)

听起来你只想要一个static对象:

public static class OptionsNames
{
    private static Dictionary<int, string> names;

    static OptionsNames()
    {
        names = new Dictionary<int, string>();
        names = LoadOptionsFromXML();
    }

    public static string GetNameById(int id)
    {
        if (names.ContainsKey(id))
             return names[id];
        return string.Empty;
    }

    // other class members
}

静态类所在的 并不重要,它可以从任何地方引用。只需确保它位于直观的位置/命名空间中。

使用代码只需直接调用它而无需创建实例:

var name = OptionsNames.GetNameById(someIdValue);

答案 1 :(得分:2)

这是一个延迟加载的单例示例

public class OptionsNames
{
    private static Dictionary<int, string> names;

    private static readonly Lazy<OptionsNames> LazyInstance = new Lazy<OptionsNames>(() => new OptionsNames());

    protected OptionsNames()
    {
        names = new Dictionary<int, string>();

        names = LoadOptionsFromXML();
    }

    public static OptionsNames Instance
    {
        get { return LazyInstance.Value; }
    }

    public static string GetNameById(int id)
    {
        if (names.ContainsKey(id))
             return names[id];
        return string.Empty;
    }        
}

你不需要在global.asax中做任何事情,只需这样调用

var name = OptionsNames.Instance.GetNameById(someIdValue);

那就是它。