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?

**

War es hilfreich?

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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top