3

おそらく、この質問は以前に別の方法で尋ねられたことがありますが、見つけることができませんでした。

たとえば、アプリケーションに 1 つ以上のプラグイン アダプター アセンブリがあり、すべて IPlugin 型です。各アダプタには、共通ディレクトリに格納された独自の設定構造があります。それらが 1 つの連続したファイルに格納されているか、別のファイルに格納されているかは問題ではありません。各アダプターには、1 つ以上の設定を関連付けることができます。設定には、名前とそれが使用されるプラグインの両方があります。
次の要件を使用して、このような構成システムを作成するにはどうすればよいですか。

  1. 設定システムに組み込まれた .NET を使用し、最初から作成することを避けたい
  2. ホスト アプリケーションは、プラグイン設定を見つけてプラグインに渡す役割を果たします。
  3. 各プラグインは、関心を分離するために独自の設定を読み書きする責任があります。ホスト アプリケーションは Plugin.Save(thePath) を呼び出す必要があります。
  4. すべての設定はユーザー スコープです

これまでのところ、独自の SettingsProvider を作成する必要があることはわかっていますが、プラグイン ディレクトリのパスや設定の名前などのパラメーターを渡す方法がないという点で、プロバイダーは分離して動作しているようです。私が見たすべてのサンプル コードでは、プロバイダがランタイム環境からデータを取得しています。

4

2 に答える 2

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();
于 2010-05-02T02:15:14.397 に答える
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();
        }
    }
}

私は同じ問題を抱えていて、それについてブログを書きました。

于 2011-10-21T10:10:31.307 に答える