.NET MVC - 全局设置类 - 以下哪种方法最好:

时间:2009-03-13 12:13:45

标签: .net asp.net-mvc settings global

好的,所以我试图创建一个设置类来存储我需要在整个系统中访问的某些字符串。我用以下代码创建了一个globalSettings.cs:

public class GlobalSettings
{
    private readonly Hashtable myHT;

    public GlobalSettings()
    {
        //Hashtable used to store global strings
        myHT = new Hashtable();
        myHT.Add("logCategory","TMBC"); //event log category
        myHT.Add("logSource", "MVC"); //event log source


        //setup required options

        //Create log source if required
        if (!EventLog.SourceExists(myHT["logSource"].ToString()))
        {
            EventLog.CreateEventSource(myHT["logSource"].ToString(), myHT["logCategory"].ToString());
        }

    }

    public string getSetting(string key)
    {
        return myHT.ContainsKey(key) ? myHT[key].ToString() : null;
    }
}

目前我在每个控制器中使用以下内容初始化了这个类:

protected GlobalSettings globalSettings = new GlobalSettings();

**我应该将构造函数设置为private并实现单例模式,因为它只是一个设置类,只需要一个实例吗?

使用设置信息扩展控制器类会更好吗?

**

2 个答案:

答案 0 :(得分:2)

就个人而言,我宁愿将这些东西分开。例如,为什么所有控制器都需要知道编写事件日志?我有一个LogWriter类和ILogWriter接口,并使用依赖注入(参见样本的MVCContrib) - 即

class FooController : Controller {
    private readonly ILogWriter logWriter;
    public FooController(ILogWriter logWriter) {
        this.logWriter = logWriter; // <==== edited for clarity
    }
}

(并使用基于DI的控制器 - 工厂)

这允许您通过模拟日志编写器来单元测试日志写入。然后,这些设置在LogWriter类中适合作为常量(或从config获取)。


回答具体问题;如果所有值都是常量,则使用常量(或者可能是静态属性):

public static GlobalSettings
{
    public static const string LogCategory = "TMBC"; //event log category
    public static const string LogSource = "MVC"; //event log source
}

如果从配置中获取字典,则字典会很有用;如果它们真正是全局的,那么静态字典就足够了 - 实例只有在展示次数之间发生变化时才有用。单身人士在这里没有任何意义;改为使用静态成员。

答案 1 :(得分:0)

@Marc Gravell

到目前为止,我有我的主控制器:

    public class TasksController : Controller
{
    private tasklistDataContext db = new tasklistDataContext();

    public TasksController(ILogWriter myWriter)
    {
        /* constructor */
    }


    //displays list of tasks
    public ActionResult Index()
    {
        ViewData["Message"] = "Task List";



        IOrderedQueryable<task> tasks = from t in db.tasks orderby t.entryDate descending select t;

        return View(tasks.ToList());
    }


}

到目前为止ILogWriter类如下:

    public class ILogWriter
{
    public static string logCategory;
    public static string logSource;

    public ILogWriter()
    {

        logCategory = "TMBC";
        logSource = "MVC";

        //Create log source if required
        if (!EventLog.SourceExists(logSource))
        {
            EventLog.CreateEventSource(logSource, logCategory);
        }

    }

    public void writeLog(string eventMsg)
    {
        EventLog.WriteEntry(logSource, eventMsg, EventLogEntryType.Error);
    }

}

我知道这应该很简单,但我对.NET很不熟悉我现在发现它有点挑战:)