2010-04-30 13 views
3

아마도이 질문은 다른 방식으로 이전에 요청되었지만 찾을 수 없었습니다.IApplicationSettingsProvider 클래스에 추가 정보를 어떻게 제공합니까?

예를 들어, 모든 플러그인 응용 프로그램 어셈블리에 하나 이상의 IPlugin 유형이 있습니다. 각 어댑터에는 공통 디렉토리에 저장된 자체 설정 구조가 있습니다. 하나의 인접한 파일이나 별도의 파일에 저장되는지 여부는 중요하지 않습니다. 각 어댑터에는 하나 이상의 설정이 연관되어있을 수 있습니다. 설정에는 사용할 이름과 플러그인이 모두 설정됩니다. 나는 다음과 같은 요구 사항을 사용하여 이러한 구성 시스템을 만드는 것 어떻게
: 나는 설정 시스템에 내장 .NETs를 사용하여 스크래치

  • 에서 를 작성하지 않도록 할

    1. 을 호스트 응용 프로그램에 대한 책임을 져야합니다 플러그인 설정의 위치와 각각의 플러그인이 독서에 대한 책임 될 것
    2. 플러그인에 전달하고를 분리하는 자신의 설정을 작성우려 사항. 호스트 응용 프로그램 은 Plugin.Save (thePath)를 호출해야하고 일을 수행해야합니다.
    3. 모든 설정은 내가 내 자신의 SettingsProvider를 작성해야한다고 인식, 사용자가 지금까지

  • 을 범위하지만 공급자는 경로 등의 매개 변수 전달하는 방법이 없다는 것을에서 분리되어 작동하는 것 같다 플러그인 디렉토리의 이름과 설정 이름. 필자가 보았던 모든 예제 코드는 제공자가 런타임 환경에서 데이터를 가져왔다.

    답변

    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.

    2

    조금 복잡해졌지만 .NET의 아키텍처에 대한 깊이있는 조사가 필요하다는 점을 잘 알고 있습니다. ApplicationSettingsBase와 IApplicationSettingsProvider는 분리되어 있지만이 작업을 수행하기 위해 약간의 재 연결이 필요합니다. 이 솔루션은과 같이 설정 또는 사용자 정의 된 버전을 수정하는 것을 포함한다 : 너무처럼 사용되기 전에

    [SettingsProvider(typeof(CustomSettingProviders.MySettingsProvider))] 
    internal sealed partial class Settings { 
    
        public Settings(string name) 
        { 
         this.Context.Add("Name", name); 
        } 
    

    을 다른 방법으로는 상황을 설정하여이 클래스를 변경하는 주위 얻을 수 있습니다 :

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

    에서 MySettingsProvider의 설정 SetPropertyValues, 당신은 실제로 데이터를 잡고 그것으로 뭔가를 할 수 있습니다

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

    설정을 사용하려면를 단순히 인 사용하기 전에 설정 교대 문맥을 매개 변수화 생성자 클래스를 tantiate, 또는 : 귀하의 예제에서

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