1

好的,所以我试图创建一个设置类来存储我需要在整个系统中访问的某些字符串。我使用以下代码创建了一个 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();

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

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

**

4

2 回答 2

2

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

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

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

这允许您通过模拟日志编写器来对日志编写进行单元测试。然后这些设置将非常适合 LogWriter 类中的常量(或从配置中获取)。


重新提出具体问题;如果所有值都是常量,请使用常量(或者可能是静态属性):

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

如果它们是从配置中获取的,那么字典会很有用;如果它们确实是全局的,那么静态字典就足够了——实例只有在印象之间发生变化时才有用。单例在这里毫无用处;改用静态成员。

于 2009-03-13T12:23:40.440 回答
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 太不熟悉了,我现在觉得它有点挑战 :)

于 2009-03-17T14:35:46.607 回答