如何向IApplicationSettingsProvider类提供额外信息?

时间:2010-04-30 18:56:40

标签: appsettings settings.settings settings

或许这个问题之前已经以不同的方式提出过,但我一直无法找到它。

我的应用程序中有一个或多个插件适配器程序集,例如所有类型都是IPlugin。每个适配器都有自己的设置结构存储在公共目录中。它们是存储在一个连续文件中还是存储在单独的文件中并不重要。每个适配器都可以有一个或多个与之关联的设置。设置将同时具有名称和将用于插件的插件 我如何使用以下要求创建这样的配置系统:

  1. 我想使用内置的.NET 设置系统,避免写作 一个从头开始
  2. 主机应用程序将是 负责查找插件 设置并将其传递给 插件
  3. 每个插件都是     负责阅读和写作     它自己的设置分开     关注。主机应用程序     应该调用Plugin.Save(thePath)和     它做到了。
  4. 所有设置均为用户范围
  5. 到目前为止,我意识到我需要编写自己的SettingsProvider,但是提供程序似乎孤立地工作,因为没有办法传递参数,例如插件目录的路径和设置的名称。我见过的所有示例代码都让提供程序从运行时环境中获取数据。

2 个答案:

答案 0 :(得分:2)

我找到了一个答案,虽然有点复杂,但需要深入研究.NET的架构,这个架构没有详细记录。尽管ApplicationSettingsBase和IApplicationSettingsProvider是分离的,但还是需要进行一些重新耦合才能使其工作。解决方案涉及修改设置或您自己的自定义版本,如下所示:

[SettingsProvider(typeof(CustomSettingProviders.MySettingsProvider))]
internal sealed partial class Settings {

    public Settings(string name)
    {
         this.Context.Add("Name", name);
    }

或者,您可以通过在使用之前设置Context来改变这个类:

        settings.Context.Add("Name", "hello");

在MySettingsProvider的SetPropertyValues设置中,您实际上可以获取数据并对其执行操作:

    public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection propvals)
    {
        if (context.Contains("Name"))
            ApplicationName = context["Name"].ToString();

要使用这些设置,只需使用参数化构造函数实例化该类,或者在使用之前设置Context:

        var settings = new Properties.Settings("Hello") { Setting1 = "Hello, is anyone home!" }
        // alternative: settings.Context.Add("Name", "hello");
        settings.Save();

答案 1 :(得分:0)

您的示例中的插件会新建PluginSettings,然后像这样调用它:

PluginSettings["age"] = "5";
int age;
if (int.TryParse(PluginSettings["age"], out age)
{

}
else
{
}

PluginSettings代码:

using System.Configuration;
using System.Xml;

public sealed class PluginSettings
{
    public string this[string propertyName]
    {
        get
        {
            var store = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            UserSettingsGroup values = (UserSettingsGroup)store.SectionGroups["userSettings"];
            if (values == null)
            {
                return null;
            }
            ClientSettingsSection myValues = (ClientSettingsSection)values.Sections[typeof(DebuggerSettings).FullName];
            if (myValues == null)
            {
                return null;
            }
            SettingElement setting = myValues.Settings.Get(propertyName);
            if (setting == null)
            {
                return null;
            }
            string returnValue = setting.Value.ValueXml.InnerText;
            return returnValue;
        }
        set
        {
            var store = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
            UserSettingsGroup addSectionGroup = (UserSettingsGroup)store.SectionGroups["userSettings"];
            if (addSectionGroup == null)
            {
                addSectionGroup = new UserSettingsGroup();
                store.SectionGroups.Add("userSettings",addSectionGroup);
            }
            string sectionName = (typeof(DebuggerSettings).FullName);
            ClientSettingsSection clientSettingsSection = (ClientSettingsSection)addSectionGroup.Sections[sectionName];
            if (clientSettingsSection == null)
            {
                clientSettingsSection = new ClientSettingsSection();
                clientSettingsSection.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
                addSectionGroup.Sections.Add(sectionName, clientSettingsSection);
            }
            SettingElement addMe = new SettingElement(propertyName, SettingsSerializeAs.String);
            XmlElement element = new XmlDocument().CreateElement("value");
            element.InnerText = value;
            addMe.Value.ValueXml = element;
            clientSettingsSection.Settings.Add(addMe);

            store.Save();
        }
    }
}

我遇到了同样的问题,blogged就此问题。

相关问题