.NET MVC - Globale Einstellungen Klasse - welche dieser Methoden ist am besten:
-
22-07-2019 - |
Frage
OK so im eine Einstellungen-Klasse zu erstellen versuchen, bestimmte Zeichenfolge zu speichern, die ich brauche im gesamten System zuzugreifen. Ich habe einen globalSettings.cs mit dem folgenden Code erstellt:
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;
}
}
Im Moment ich diese Klasse initialisiert habe in jedem meines Controller mit dem folgenden:
protected GlobalSettings globalSettings = new GlobalSettings();
** Soll ich den Konstruktor für private und den Singletonmuster implementieren, wie es afterall eine Einstellungen-Klasse ist und benötigt nur eine Instanz?
Wurde ich in die Controller-Klasse mit der Einstellung Informationen besser dran erstreckt?
**
Lösung
Persönlich würde ich eher die Dinge compartmentalize. Zum Beispiel, warum brauchen alle Ihre Controller über das Schreiben von Ereignisprotokollen wissen? Ich würde eine einzige LogWriter Klasse haben und ILogWriter-Schnittstelle und verwenden Dependency Injection (siehe MVCContrib für Proben) - d. H
class FooController : Controller {
private readonly ILogWriter logWriter;
public FooController(ILogWriter logWriter) {
this.logWriter = logWriter; // <==== edited for clarity
}
}
(und mit einer DI-basierten Controller-Fabrik)
So können Sie Unit-Test das Log-Schreiben durch die Log-writer spöttisch. Dann würden die Einstellungen recht gut als Konstanten passen (oder abgerufen aus config) innerhalb der LogWriter Klasse.
Re die spezifische Frage; wenn alle Werte konstant sind, verwendet Konstanten (oder vielleicht auch statische Eigenschaften):
public static GlobalSettings
{
public static const string LogCategory = "TMBC"; //event log category
public static const string LogSource = "MVC"; //event log source
}
Ein Wörterbuch wäre nützlich, wenn sie von der Konfiguration geholt werden; wenn sie wirklich global sind, ein statisches Wörterbuch ausreichen sollte - Instanzen wäre nur dann sinnvoll, wenn es zwischen Eindrücke ändert. Ein Singleton dienen würde keinen Sinn hier; verwenden statische Mitglieder statt.
Andere Tipps
@Marc Gravell
Bisher habe ich meine Haupt-Controller haben:
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());
}
}
Die ILogWriter Klasse so weit unter:
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);
}
}
Ich weiß, das sollte einfach sein, aber ich bin so nicht vertraut mit .NET Ich finde es ein bisschen im Moment herausfordernd:)