处理从配置文件读取的参数的正确方法是什么?

What is correct approach to handle parameters read from config file?

我有一个应用程序使用 App.config 文件来存储整个应用程序中使用的参数。参数代表文件名、路径等。

主要调用如下所示:

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

    ...
}

什么是正确的做法:

1) 使用单独的 class 如下:

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

并在需要时使用它。

或者:

2) 使用参数数组如下:

CsvExtractor.ExtractDataAndCopyFiles(list_of_params);

...

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

    ...
}

我喜欢做选项 1),但有点抽搐。

创建应包含设置的模型:

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

装载机

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

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

通过分离配置模型和它的填充将分离您使用 app.config 进行设置的事实。这在考虑测试等时很有用。 这当然只有在你不使用静态的东西,但更多的依赖注入方法时才有效。

选项 1) +1 但是在我的项目中我们做了这样的事情

public class AppSettingsManager : IAppSettingsManager
{
    private static string filesFolder;

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

            return filesFolder;
        }
    }
}

我们将配置文件中的值保存在静态变量中。当需要时,我们从这个变量中获取它。