.NET MVC - класс глобальных настроек - какой из этих методов лучше: - PullRequest
1 голос
/ 13 марта 2009

ОК, поэтому я пытаюсь создать класс настроек для хранения определенных строк, к которым мне нужен доступ по всей системе. Я создал 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();

** Должен ли я установить конструктор в приватное состояние и реализовать шаблон синглтона, так как он после всего класса настроек и нужен только один экземпляр?

Будет ли лучше расширить класс контроллеров информацией о настройках?

**

Ответы [ 2 ]

2 голосов
/ 13 марта 2009

Лично я предпочел бы разделить эти вещи. Например, почему все ваши контроллеры должны знать о записи журналов событий? У меня был бы один класс 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
}

Словарь был бы полезен, если они получены из конфигурации; если они действительно глобальные, статического словаря должно хватить - экземпляры будут полезны только в том случае, если он меняется между показами. Синглтон здесь не будет служить цели; вместо этого используйте статические члены.

0 голосов
/ 17 марта 2009

@ Марк Гравелл

Пока у меня есть мой главный контроллер:

    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, что сейчас мне немного сложно :)

...