Question

OK, je suis donc en train de créer une classe de paramètres pour stocker certaines chaînes auxquelles je dois accéder dans tout le système. J'ai créé un fichier globalSettings.cs avec le code ci-dessous:

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

Pour le moment, j'ai initialisé cette classe dans chacun de mes contrôleurs avec les éléments suivants:

protected GlobalSettings globalSettings = new GlobalSettings();

** Devrais-je définir le constructeur sur privé et implémenter le modèle singleton, car il s'agit après tout d'une classe de paramètres et ne nécessite qu'une seule instance?

Aurais-je intérêt à étendre la classe de contrôleur avec les informations de réglage qu'il contient?

**

Était-ce utile?

La solution

Personnellement, je préférerais compartimenter ces choses. Par exemple, pourquoi tous vos contrôleurs doivent-ils savoir comment écrire des journaux d'événements? J'aurais une seule classe LogWriter et une interface ILogWriter, et utiliserais l'injection de dépendance (voir MVCContrib pour des exemples), c'est-à-dire.

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

(et en utilisant un contrôleur-usine basé sur DI)

Ceci vous permet de tester l’écriture du journal en se moquant de celui-ci. Ensuite, les paramètres s’adapteraient plutôt comme des constantes (ou extraites de config) dans la classe LogWriter.

Re la question spécifique; si toutes les valeurs sont constantes, utilisez des constantes (ou peut-être des propriétés statiques):

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

Un dictionnaire serait utile s’ils sont extraits de la configuration; s'ils sont vraiment globaux, un dictionnaire statique devrait suffire - les instances ne seraient utiles que s'il change entre les impressions. Un singleton ne servirait à rien ici; utilisez plutôt des membres statiques.

Autres conseils

@Marc Gravell

Jusqu'à présent, j'ai mon contrôleur 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 classe ILogWriter est jusqu'ici inférieure à:

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

}

Je sais que cela devrait être simple, mais je suis tellement peu familier avec .NET, je le trouve un peu difficile en ce moment:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top