Classe di istanza che contiene metodi per controllare alcune impostazioni e restituire valori dal mio file app.config

4

Sto scrivendo un'applicazione per console e ho una classe chiamata ApplicationConfiguration che contiene metodi per controllare alcune impostazioni e anche restituire valori dal mio file app.config. Ad esempio il seguente metodo nella classe ApplicationConfiguration restituisce il percorso del file di registro dal mio file app.config :

public string ProjectLog
        {
            get
            {
                _projectLog = ConfigurationManager.AppSettings["ProjectLog"].ToString();
                return _projectLog;
            }
        }

Ho una classe FileLogger e una classe DBConnection che richiederebbero anche valori restituiti da metodi in ApplicationConfiguration . La mia domanda è che i valori nel file app.config sono usati in molte delle mie altre classi devo creare un'istanza di ApplicationConfiguration in ogni classe che potrebbe aver bisogno dei miei valori di configurazione in questo modo?

public class FileLogger
  {
        ApplicationConfiguration appConfig = new ApplicationConfiguration();
   }
public class DBConnection
  {
        ApplicationConfiguration appConfig = new ApplicationConfiguration();
  }
    
posta JM456 20.07.2015 - 18:53
fonte

3 risposte

1

Solo il tuo programma dovrebbe sapere che esistono le impostazioni dell'app. leggilo e passalo agli altri tuoi oggetti. Facile

    public class Program
    {
        static void Main(string[] args)
        {
            var projectLog = ConfigurationManager.AppSettings["ProjectLog"];  
            FileLogger logger = new FileLogger(projectLog);      
            DbConnection dbConn = new DbConnection(projectLog);
            //etc etc
        }
    }

  public class FileLogger
  {
        private string logLocation;
        public FileLogger(string logLocation)
        {
            this.logLocation = loglocation;
        }
   }
    
risposta data 20.07.2015 - 19:53
fonte
3

Se sei sicuro che le tue impostazioni di configurazione non cambieranno molto, allora puoi avvolgere la tua classe di configurazione nel modificatore "statico" a volte corretto, in questo modo:

namespace ConsoleAppName
{
    class Program
    {
        static void Main(string[] args)
        {
            var _projectLog = MyAppConfiguration.LogLocation;
        }
    }

    public static class MyAppConfiguration
    {
        public static string LogLocation
        {
            get { return ConfigurationManager.AppSettings["ProjectLog"]; }
        }
    }
}

In questo modo "ti blocca" nel solo modo di ripristinare queste impostazioni, ma se sei ragionevolmente sicuro che non dovrai caricare in modo condizionato impostazioni diverse dalla configurazione della console in base alle condizioni di runtime, allora è perfettamente ragionevole e chiaro di farlo in questo modo. Indipendentemente da ciò, questo metodo ti darà la possibilità di fare le cose in un secondo momento, come estrarre quell'impostazione da un database e metterla nella cache, se si presenterà una tale esigenza.

    
risposta data 20.07.2015 - 19:26
fonte
0

Questo sembra un buon uso del modello singleton

Fondamentalmente, ti permette di avere una singola classe che viene creata una volta per tutta la durata del sistema, che viene creata quando ti si accede.

Ecco un semplice esempio:

public sealed class Configuration
{
    private static Configuration instance = null;
    private static readonly object padlock = new object();

    private string _logLocation;
    public string LogLocation { get { return _logLocation; } }

    Configuration()
    {
        _logLocation = ConfigurationManager.AppSettings["ProjectLog"];
    }

    public static Configuration Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

Quindi chiamalo ovunque in questo modo:

Configuration.Instance.LogLocation

Anche se in generale sono d'accordo con il consenso generale sul fatto che i singleton siano un antipattern , ho usato una versione leggermente modificata di questo modello ha un grande successo con alcuni dati di tipo di configurazione.

Come sempre, YMMV.

    
risposta data 20.07.2015 - 19:48
fonte

Leggi altre domande sui tag