2016-12-13 4 views
0

J'ai une application qui utilise le fichier App.config pour stocker les paramètres utilisés dans l'application. Les paramètres représentent les noms de fichiers, les chemins et similaires.Quelle est l'approche correcte pour gérer les paramètres lus à partir du fichier de configuration?

L'appel principal se présente comme suit:

CsvExtractor.ExtractDataAndCopyFiles(); 

... 

public class CsvExtractor 
{ 
    public static void ExtractDataAndCopyFiles() 
    { 
     var eventList = DataReader.ReadInputCsvFile(ExtractorParams.InputCsvFile, ExtractorParams.SheetName); 
     DataWriter.WriteOutputCsvFile(
      ExtractorParams.OutputCsvFile, 
      CreateExtractData(eventList), 
      ExtractorParams.EventFolder, 
      ExtractorParams.BlobFolder, 
      ExtractorParams.MissingFiles); 
    } 

    ... 
} 

Quelle est l'approche correcte:

1) Utilisez la classe séparée comme suit:

public class ExtractorParams 
{ 
    public static string InputCsvFile 
    { 
     get { return ConfigurationManager.AppSettings["InputCsvFile"]; } 
    } 

    public static string SheetName 
    { 
     get { return ConfigurationManager.AppSettings["SheetName"]; } 
    } 

    public static string EventFolder 
    { 
     get { return ConfigurationManager.AppSettings["EventFolder"]; } 
    } 

    public static string BlobFolder 
    { 
     get { return ConfigurationManager.AppSettings["BlobFolder"]; } 
    } 

    public static string OutputCsvFile 
    { 
     get { return ConfigurationManager.AppSettings["OutputCsvFile"]; } 
    } 

    public static string MissingFiles 
    { 
     get { return ConfigurationManager.AppSettings["MissingFiles"]; } 
    } 
} 

et l'utiliser en cas de besoin comme ci-dessus .

Ou:

2) Utilisez le tableau de paramètres comme suit:

CsvExtractor.ExtractDataAndCopyFiles(list_of_params); 

... 

public class CsvExtractor 
{ 
    public static void ExtractDataAndCopyFiles(params string[] list) 
    { 
     ... 
    } 

    ... 
} 
+1

Il n'y a pas de réponses "correctes" seulement pour les commentaires. Certains préfèrent les collections pour réduire le nombre de paramètres; d'autres préfèrent des paramètres distincts, de sorte qu'il est plus clair ce qui est nécessaire pour que la fonction fonctionne correctement. –

+0

En outre, si vous utilisez la première approche lorsque vous modifiez le nom du paramètre, vous devez le modifier en un seul endroit. –

Répondre

0

option 1) +1 Mais dans mon projet que nous avons fait quelque chose comme ça

public class AppSettingsManager : IAppSettingsManager 
{ 
    private static string filesFolder; 

    public static string FilesFolder 
    { 
     get 
     { 
      if (filesFolder == null) 
      { 
       filesFolder = filesFolder = ConfigurationManager.AppSettings["FilesFolder"]; 
      } 

      return filesFolder; 
     } 
    } 
} 

nous avons économisé une valeur de fichier de configuration dans la variable statique. quand il le fallait nous l'obtenons de cette variable.

0

J'aime faire l'option 1), mais avec un peu de mouvement convulsif.

Créer un modèle qui doit contenir les paramètres suivants:

public class CsvConfig 
{ 
    public string Opt1 { get; set; } 
    public string Opt2 { get; set; } 
    //.... 
} 

Chargeur

public class Config 
{ 
    public CvsConfig Csv { get; private set; } 

    public Config() 
    { 
     Csv = new CsvConfig 
     { 
      // load stuff from where ever 
     } 
    } 
} 

En séparant le modèle de configuration et la population de ce dissociera le fait que vous utilisez l'application. config pour les paramètres. Ceci est utile lorsque l'on pense au test, etc. Ceci bien sûr ne fonctionne que si vous n'utilisez pas de choses statiques, mais une approche plus dépendant de l'injection.