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

StackOverflow https://stackoverflow.com/questions/642392

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top