2个应用程序之间共享配置

时间:2013-12-20 12:27:44

标签: c# configuration

感觉这应该是一个简单的解决方案。

我正在开发一个具有几个组件的工具 - 它将作为命令行工具启动,然后我们将在wpf应用程序中打包。该工具用于生成数据库迁移脚本。这些将由源控制并位于每个用户机器上的特定位置。

我想将此位置存储为不需要提供给命令行程序并且可以在UI版本中设置的设置。在这样的程序之间共享可能还有其他信息(以一次/很少的方式)。

我不希望在代码中有一个配置文件的硬编码路径,因为它不能在程序的不同用户之间移植。

我知道我可以将目录名称传递给命令行应用程序,也可以通过人们在他们的计算机上手动设置一个应用程序配置来实现。我不喜欢前者,因为它是重复的,命令行上的输入路径是一种痛苦,我不喜欢后者,因为如果你需要改变它,那么你必须弄清楚程序正在做什么,然后去随机文件夹挖掘手动修改文件(这又是非常糟糕的!)。

这似乎应该解决问题而且可能是 - 我觉得我可能在某个地方错过了一个技巧。

我并不担心使用本机设置对象 - 在很多方面我更喜欢它只是一个xml文件,因为这样可以保证升级或添加新内容的简单和简单。

想法!

3 个答案:

答案 0 :(得分:1)

  1. 当程序第一次运行时,您只能向用户询问一次目录。然后,您将在设置中存储提供的值,然后使用它。当然,您必须提供稍后覆盖此值的可能性。
  2. 如果我理解正确,您不希望让用户在某些“奇怪”文件夹中查找配置文件。如果是这样,您可以考虑使用 Environment.GetFolderPath 来获取 MyDocuments Desktop 或任何其他知名目录的路径并在那里保存设置
  3. 关于设置。它们已经存储为XML。如果您不喜欢此XML的结构,则可以创建自己的自定义设置提供程序(请参阅 SettingsProviderAttribute )。您还可以轻松创建自己的解决方案。只需创建一个包含某些属性的类并对其进行序列化/反序列化就足够了,例如使用 XmlSerialzier

答案 1 :(得分:0)

我认为,您可以使用machine.config来存储全局可见的条目。

您可以根据目标.net框架和OS位

找到它
  1. 对于.NET 2.0和3.5 - > c:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\
  2. 对于.NET 4.0 - > c:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\
  3. 我没有在应用程序中使用machine.config而不是基于Web的。但是,值得一试。

    您还可以在MSDN上找到一些示例代码here

    注意:如果您处于64位环境中,则有两个machine.config文件。一个用于Framework64,一个用于Framework。确保它在正确的一个或两个。

答案 2 :(得分:0)

我正在研究的项目最终只是一个命令行工具集合,其中一些工具构建在其他工具之上。

这些设置实际上并不是为了在命令行中使用而设计的 - 我已经记录了我在this other post中遇到的很多痛苦。经过所有这些事情后,我终于发现他们不进行交叉组装 - 如果你调用一个具有其他程序集设置的程序集,你将获得新设置,而不是其他程序集在​​其上运行时将使用的设置&#39自己的。

我最终解决这个问题的方法就是手工完成。当它归结为它时,自己写一些东西并不难

它的架构非常类似于库1:

主要类看起来像这样:

public class ProgramSettings
{
    private readonly string _path;
    private readonly List<Setting> _settings;
    private readonly SettingProvider _settingProvider;
    private readonly ConsoleWriter _writer;

    public ProgramSettings(string programName, SettingProviderFactory settingProviderFactory, ConsoleWriter writer)
    {
        _writer = writer;
        var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        var folder = Path.Combine(appData, companyName, programName);
        _path = Path.Combine(folder, "settings.xml");
        _settings = new List<Setting>();

        if (!Directory.Exists(folder))
            Directory.CreateDirectory(folder);

        _settingProvider = settingProviderFactory.GetProvider(_path, _settings);
    }

    public Setting Add(string name, string description)
    {
        var setting = new Setting(name, description);
        _settings.Add(setting);
        return setting;
    }

    public string Load()
    {
        _settingProvider.Load();
        _writer.WriteLine("using config at " + _path);

        if (_settings.All(s => s.IsSet))
            return null;

        _settingProvider.Save();

        var description = string.Join("\n", _settings.Where(s => !s.IsSet).Select(s => s.Description));
        return description + "\n need setting in config";
    }
}

设置本身如下:

public class Setting
{
    private readonly string _description;
    public string Name { get; private set; }

    public Setting(string name, string description)
    {
        Name = name;
        _description = description;
    }

    public string Value { get; set; }

    public string Description
    {
        get { return string.Format("{0}: {1}", Name, _description); }
    }

    public bool IsSet
    {
        get { return Value != null; }
    }
}

除此之外,您只需要根据我省略的设置写出xml文件的内容,以及为了简洁起见,加上一些令人兴奋的界面+硬编码的公司名称。