2012-05-05 12 views
1

アプリケーションセッション間でデータを保持したいと思っていた.NET Configuration API(System.Configuration名前空間)を使用することにしました。データなしで保存されたカスタム設定セクション

私がようにカスタム構成セクションを作成しました

:今

UserMailSourcesSection

public class UserMailSourcesSection : ConfigurationSection 
{ 
    [ConfigurationProperty("User", IsRequired = true)] 
    public string User { get; set; } 

    [ConfigurationProperty("UserMailSources", IsDefaultCollection = false)] 
    [ConfigurationCollection(typeof(MailSourceElemet))] 
    public MailSourceElemetCollection MailSources 
    { 
     get 
     { 
      return (MailSourceElemetCollection)this["UserMailSources"]; 
     } 

     set 
     { 
      this["UserMailSources"] = value; 
     } 
    } 

    public UserMailSourcesSection() 
    { 
     this.User = String.Empty; 
    } 
} 

(関連するコードの残りの部分は、質問の最後にある)

実際の問題は、私が永続化したいすべての値を設定した後で、このセクションを保存したコードの部分から例外(非常に説明的なものではなく、気にしています)を取得していたことでした。私はいくつかのヌル値を持つパラメータで呼び出されたMailSourceElementCollection.Addまで追跡しました。そのパラメータはMicrosoftのコードから渡されました。私は、デフォルトのパラメータレスコンストラクタでパラメータの新しいインスタンスを作成する必要があることを推論しました。 私は、NULL値を何らかの種類のデフォルト(特にString.Empty)で置き換えて動作するように見える、パラメータのないコンストラクタを明示的に記述することになります。コード実行、保存方法はスローされませんでしたが、新たな問題があった - データが実際に私は明示的Mainメソッドですべてを設定していても保存されていないされていました:

PublisherElemet publisher = new PublisherElemet(); 
publisher.Publisher = "test"; 

PublisherElementCollection publishers = new PublisherElementCollection(); 
publishers.Add(publisher); 
MailSourceElemet mailSource = new MailSourceElemet(); 
mailSource.HostName = "test"; 
mailSource.Port = 0; 
mailSource.Username = "test"; 
mailSource.Password = "test"; 
mailSource.Publishers = publishers; 

MailSourceElemetCollection mailSources = new MailSourceElemetCollection(); 
mailSources.Add(mailSource); 

UserMailSourcesSection userMailSources = new UserMailSourcesSection(); 
userMailSources.User = Environment.UserName; 
userMailSources.MailSources = mailSources; 

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
config.Sections.Add("MailSources", userMailSources); 
config.Save(ConfigurationSaveMode.Modified); 

この後予想される出力されました:

実際の出力があったが、
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<configSections> 
    <section name="MailSources" type="Email_To_Rss_V2.Classes.UserMailSourcesSection, Email-To-Rss-V2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</configSections> 
<MailSources User="User"> 
    <UserMailSources> 
    <add HostName="test" Port="0" Username="test" Password="test"> 
     <Publishers> 
     <add Publihser="test" /> 
     </Publishers> 
    </add> 
    </UserMailSources> 
</MailSources> 

は:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<configSections> 
    <section name="MailSources" type="Email_To_Rss_V2.Classes.UserMailSourcesSection, Email-To-Rss-V2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</configSections> 
<MailSources User=""> 
    <UserMailSources> 
    <add HostName="" Port="0" Username="" Password=""> 
     <Publishers> 
     <add Publihser="" /> 
     </Publishers> 
    </add> 
    </UserMailSources> 
</MailSources> 

本当に奇妙なことは、それだけでファイルに出力していないようでした、デバッガにデータが存在することが示されたということでした。

MailSourceElementCollection

public class MailSourceElemetCollection : ConfigurationElementCollection 
{ 
    public override ConfigurationElementCollectionType CollectionType 
    { 
     get 
     { 
      return ConfigurationElementCollectionType.AddRemoveClearMap; 
     } 
    } 

    public MailSourceElemet this[int index] 
    { 
     get 
     { 
      return (MailSourceElemet)BaseGet(index); 
     } 

     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 

      BaseAdd(0, value); 
     } 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     if (((MailSourceElemet)element).Username == null) 
     { 
      Console.WriteLine("null"); 
     } 

     return ((MailSourceElemet)element).Username; 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new MailSourceElemet(); 
    } 

    public void Add(MailSourceElemet mailSource) 
    { 
     BaseAdd(mailSource); 
    } 

    public void Clear() 
    { 
     this.BaseClear(); 
    } 

    public void Remove(MailSourceElemet element) 
    { 
     BaseRemove(element.Username); 
    } 

    public void Remove(string name) 
    { 
     BaseRemove(name); 
    } 

    public void RemoveAt(int index) 
    { 
     BaseRemoveAt(index); 
    } 
} 

MailSourceElement

public class MailSourceElemet : ConfigurationElement 
{ 
    [ConfigurationProperty("HostName", IsRequired = true)] 
    public string HostName { get; set; } 

    [ConfigurationProperty("Port", IsRequired = true)] 
    public int Port { get; set; } 

    [ConfigurationProperty("Username", IsRequired = true)] 
    public string Username { get; set; } 

    [ConfigurationProperty("Password", IsRequired = true)] 
    public string Password { get; set; } 

    [ConfigurationProperty("Publishers", IsDefaultCollection = false)] 
    [ConfigurationCollection(typeof(PublisherElemet))] 
    public PublisherElementCollection Publishers 
    { 
     get 
     { 
      return (PublisherElementCollection)this["Publishers"]; 
     } 

     set 
     { 
      this["Publishers"] = value; 
     } 
    } 

    public MailSourceElemet() 
    { 
     this.HostName = String.Empty; 
     this.Port = 0; 
     this.Username = String.Empty; 
     this.Password = String.Empty; 
    } 
} 

PublisherElementCollection

:ここ

は、関連するコードの残りの部分です
public class PublisherElementCollection : ConfigurationElementCollection 
{ 
    public override ConfigurationElementCollectionType CollectionType 
    { 
     get 
     { 
      return ConfigurationElementCollectionType.AddRemoveClearMap; 
     } 
    } 

    public PublisherElemet this[int index] 
    { 
     get 
     { 
      return (PublisherElemet)BaseGet(index); 
     } 

     set 
     { 
      if (BaseGet(index) != null) 
      { 
       BaseRemoveAt(index); 
      } 

      BaseAdd(0, (PublisherElemet)value); 
     } 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((PublisherElemet)element).Publisher; 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new PublisherElemet(); 
    } 

    public void Add(PublisherElemet publisher) 
    { 
     BaseAdd(publisher); 
    } 

    public void Clear() 
    { 
     this.BaseClear(); 
    } 

    public void Remove(PublisherElemet publisher) 
    { 
     BaseRemove(publisher.Publisher); 
    } 

    public void Remove(string name) 
    { 
     BaseRemove(name); 
    } 

    public void RemoveAt(int index) 
    { 
     BaseRemoveAt(index); 
    } 
} 

PublisherElement

public class PublisherElemet : ConfigurationElement 
{ 
    [ConfigurationProperty("Publihser", IsRequired = true)] 
    public string Publisher { get; set; } 

    public PublisherElemet() 
    { 
     Publisher = String.Empty; 
    } 
} 

事前に感謝します!

答えて

3

'Visual Studioアドインをグラフィカルに設計して、.NET構成セクションを設計し、必要なすべてのコードとそれらのためのスキーマ定義(XSD)を自動的に生成することができます。' Configuration Section Designer ' '

このツールを使用して設定セクションを設計すると、[私はあなたがそれを愛していると思う:)]。

+0

ありがとうございます...良いことと思われます。しようとします。 – Regfor

+0

ありがとうございます、私は構成セクションデザイナーによって生成されたクラスで動作するようにしました。私は自分のコードと生成されたコードとの違いが、今すぐ問題を見つけることを見たいと思っています。 – Michael

+0

OK、私は構成セクションデザイナーと私のコードによって生成されたコードと、重要ではないようないくつかの違いの他に、間違った場所にいくつかの属性があることがわかりました。ありがとう、解決! – Michael

関連する問題