Domanda

OK, quindi sto provando a creare una classe di impostazioni per memorizzare determinate stringhe a cui devo accedere in tutto il sistema. Ho creato un globalSettings.cs con il codice seguente:

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

Al momento ho inizializzato questa classe in ognuno dei miei controller con il seguente:

protected GlobalSettings globalSettings = new GlobalSettings();

** Devo impostare il costruttore su privato e implementare il modello singleton in quanto è una classe di impostazioni e necessita solo di un'istanza?

Sarebbe meglio estendere la classe controller con le informazioni di impostazione in esso?

**

È stato utile?

Soluzione

Personalmente, preferirei compartimentare quelle cose. Ad esempio, perché tutti i controller devono conoscere la scrittura dei registri degli eventi? Avrei una singola classe LogWriter e interfaccia ILogWriter e utilizzerei l'iniezione delle dipendenze (vedi MVCContrib per gli esempi) - cioè

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

(e utilizzando una fabbrica di controller basata su DI)

Ciò consente di testare l'unità di scrittura del registro deridendo il log-writer. Quindi le impostazioni si adatterebbero ragionevolmente bene come costanti (o recuperate da config) all'interno della classe LogWriter.


Riguardo alla domanda specifica; se tutti i valori sono costanti, utilizzare le costanti (o forse le proprietà statiche):

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

Un dizionario sarebbe utile se fossero recuperati dalla configurazione; se sono veramente globali, è sufficiente un dizionario statico: le istanze sarebbero utili solo se cambia tra le impressioni. Un singleton non servirebbe a nulla qui; usa invece membri statici.

Altri suggerimenti

@Marc Gravell

Finora ho il mio controller principale:

    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 finora è di seguito:

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

}

So che dovrebbe essere semplice, ma non ho familiarità con .NET, al momento lo trovo un po 'stimolante :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top