或许这个问题之前已经以不同的方式提出过,但我一直无法找到它。
我的应用程序中有一个或多个插件适配器程序集,例如所有类型都是IPlugin。每个适配器都有自己的设置结构存储在公共目录中。它们是存储在一个连续文件中还是存储在单独的文件中并不重要。每个适配器都可以有一个或多个与之关联的设置。设置将同时具有名称和将用于插件的插件 我如何使用以下要求创建这样的配置系统:
到目前为止,我意识到我需要编写自己的SettingsProvider,但是提供程序似乎孤立地工作,因为没有办法传递参数,例如插件目录的路径和设置的名称。我见过的所有示例代码都让提供程序从运行时环境中获取数据。
答案 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就此问题。