繁体   English   中英

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

[英]Sharing configuration between 2 applications

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

我正在开发一个包含几个组件的工具-它将从命令行工具开始,然后将其包装在wpf应用程序中。 该工具用于生成数据库迁移脚本。 这些将由源代码控制,并位于每个用户计算机上的特定位置。

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

我不想在代码中有指向配置文件的硬编码路径,因为该路径不会在程序的不同用户之间移植。

我知道我可以将目录名传递给命令行应用程序,也可以通过人们在其计算机上手动设置一次应用程序配置来实现。 我不喜欢前者,因为它是重复性的,并且在命令行上键入路径很麻烦,而我不喜欢后者,因为如果需要更改它,则必须弄清楚程序在做什么,然后在随机文件夹中四处挖掘手动修改文件(这又太可怕了!)。

看来这应该解决的问题很可能是-我觉得我可能在某个地方缺少技巧。

我不必担心使用本机的Settings对象-在许多方面,我希望它只是某个地方的xml文件,因为这样可以使升级或添加新东西变得轻松而简单。

请点子!

  1. 首次运行该程序时,您只能向用户询问一次目录。 然后,您将提供的值存储在设置中,然后再使用它。 当然,您必须提供以后可以覆盖此值的可能性。
  2. 如果我正确理解您的意思,则您不想让用户在某些“奇怪”文件夹中寻找配置文件。 如果是这样,您可以考虑使用Environment.GetFolderPath来获取MyDocumentsDesktop或任何其他众所周知的目录的路径,并将设置保存在那里。
  3. 至于设置。 它们已经存储为XML。 如果您不喜欢此XML的结构,则可以创建自己的自定义设置提供程序(有关SettingsProviderAttribute的信息 )。 您也可以轻松创建自己的解决方案。 创建具有某些属性的类并将其序列化/反序列化(例如,使用XmlSerialzier)就足够了。

我想,您可以使用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\\

我没有在不是基于Web的应用程序中使用过machine.config。 但是,值得一试。

您还可以找到一些示例代码在这里在MSDN。

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

我正在从事的项目最终只是一些命令行工具的集合,其中一些是在其他工具的基础上构建的。

这些设置确实不是设计用于命令行的-我在一篇文章中记录了很多痛苦。 经过所有这些工作之后,我终于发现它们不能跨程序集工作-如果您调用的程序集具有另一个程序集的设置,您将获得新设置,而不是如果其他程序集自己运行时将使用的设置。

我最终解决此问题的方法是手工完成。 归根结底,自己写点东西并不难

它的体系结构与库一非常相似:

主类如下所示:

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文件写出来的内容,为了简洁起见,我省略了一些内容,加上一些令人兴奋的接口+硬编码的公司名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM