.NET MVC — класс глобальных настроек — какой из этих методов лучше:
-
22-07-2019 - |
Вопрос
Хорошо, я пытаюсь создать класс настроек для хранения определенных строк, к которым мне нужен доступ во всей системе.Я создал 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();
**Должен ли я установить частный конструктор и реализовать шаблон Singleton, поскольку в конце концов это класс настроек, и ему нужен только один экземпляр?
Будет ли мне лучше расширить класс контроллера, включив в него информацию о настройках?
**
Решение
Лично я предпочитаю разделить эти вещи на отдельные части.Например, почему всем вашим контроллерам необходимо знать о записи журналов событий?У меня был бы один класс 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
}
Словарь был бы полезен, если бы он был получен из конфигурации;если они действительно глобальные, статического словаря должно быть достаточно - экземпляры будут полезны только в том случае, если они изменяются между показами.Синглтон здесь бесполезен;вместо этого используйте статические члены.
Другие советы
@Марк Гравелл
На данный момент у меня есть основной контроллер:
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, что сейчас нахожу это немного сложным :)