Pergunta

OK, então eu estou tentando criar uma classe de configurações para armazenar determinadas seqüências que eu preciso acessar todo o sistema. Eu criei um globalSettings.cs com o código abaixo:

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;
    }
}

No momento eu tenha iniciado essa classe em cada um dos meus controladores com o seguinte:

protected GlobalSettings globalSettings = new GlobalSettings();

** Devo definir o construtor para privada e implementar o padrão singleton como é afinal uma classe de configurações e só precisa de um exemplo?

Será que eu estaria melhor fora estendendo a classe controlador com as informações configuração nele?

**

Foi útil?

Solução

Pessoalmente, eu prefiro compartimentar as coisas. Por exemplo, por que todos os controladores precisam saber sobre a escrita de logs de eventos? Eu teria uma única classe LogWriter e interface de ILogWriter, e injeção de uso de dependência (ver MVCContrib para amostras.) - ou seja

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

(e usando um controlador de fábrica baseada DI)

Isso permite que você teste de unidade do log-escrito pela zombando do log-escritor. Em seguida, as configurações se encaixam razoavelmente bem como constantes (ou obtido a partir de configuração) no interior da classe LogWriter.


Re a questão específica; se todos os valores são constantes, constantes de uso (ou propriedades talvez estáticos):

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

Um dicionário seria útil se eles são obtidos a partir da configuração; se eles são verdadeiramente global, um dicionário estático deve ser suficiente - casos só seria útil se ele muda entre impressões. Um singleton não teria nenhuma utilidade aqui; usar membros estáticos em vez.

Outras dicas

@ Marc Gravell

Até agora eu tenho meu controlador principal:

    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());
    }


}

A classe ILogWriter até agora é abaixo:

    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);
    }

}

eu sei que isso deve ser simples, mas eu estou tão familiarizado com .NET estou achando um pouco difícil no momento:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top