Pregunta

OK, así que estoy tratando de crear una clase de configuración para almacenar ciertas cadenas a las que necesito acceder en todo el sistema. He creado un globalSettings.cs con el siguiente código:

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

En este momento he inicializado esta clase en cada uno de mis controladores con lo siguiente:

protected GlobalSettings globalSettings = new GlobalSettings();

** ¿Debo configurar el constructor como privado e implementar el patrón singleton ya que después de todo es una clase de configuración y solo necesita una instancia?

¿Sería mejor extender la clase de controlador con la información de configuración?

**

¿Fue útil?

Solución

Personalmente, prefiero compartimentar esas cosas. Por ejemplo, ¿por qué todos sus controladores necesitan saber acerca de cómo escribir registros de eventos? Tendría una sola clase LogWriter e interfaz ILogWriter, y usaría inyección de dependencia (vea MVCContrib para muestras), es decir,

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

(y usando una fábrica de controladores basada en DI)

Esto le permite probar la escritura del registro burlándose del escritor del registro. Luego, la configuración encajaría razonablemente bien como constantes (o extraídas de la configuración) dentro de la clase LogWriter.


Re la pregunta específica; si todos los valores son constantes, use constantes (o quizás propiedades estáticas):

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

Un diccionario sería útil si se obtienen de la configuración; si son verdaderamente globales, un diccionario estático debería ser suficiente; las instancias solo serían útiles si cambian entre impresiones. Un singleton no serviría de nada aquí; use miembros estáticos en su lugar.

Otros consejos

@Marc Gravell

Hasta ahora tengo mi 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());
    }


}

La clase ILogWriter hasta ahora está debajo:

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

}

Sé que esto debería ser simple, pero no estoy tan familiarizado con .NET. Me resulta un poco difícil por el momento :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top