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

时间:2016-12-13 15:03:05

标签: c# app-config

我有一个应用程序,它使用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)使用单独的类如下:

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)
    {
        ...
    }

    ...
}

2 个答案:

答案 0 :(得分:0)

我喜欢做选项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 :(得分:0)

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

我们在静态变量中保存了配置文件中的值。当它需要时我们从这个变量中得到它。