Должен ли я добавить собственный раздел в app.config? Если так, то как? - PullRequest
1 голос
/ 16 ноября 2011

У меня есть программа, которая периодически опрашивает определенную папку для файлов журнала.Когда он находит файл журнала, он читает его, делает все, что должен, и движется дальше.Программа, которая записывает файлы журнала, продолжает добавлять, а не перезаписывать, поэтому я сохраняю дату последнего изменения и строку закладок, где бы я ни находился до последнего раза, когда я читал файл.Пока все хорошо.

Теперь я хочу сохранить информацию о моей закладке, чтобы, если я закрою приложение опроса и перезапущу его, оно не запустится снова в начале каждого файла журнала.Я не хочу беспокоиться о хранении информации в БД;подойдет простой XML-файл.Поэтому я подумал о сохранении информации в файле app.config.

Первый вопрос: это неправильное решение?app.config предназначен только для чтения, а не для записи во время выполнения?В таком случае, логичным ответом будет просто написать отдельный XML-файл?

Во-вторых, если это нормально, сделать это: я нашел хороший пост в блоге о , как создать пользовательский раздел конфигурации , но, похоже, он испортил другие части приложения, которые пытаются прочитать файл конфигурации, используя ConfigurationManager.AppSettings.Get(key), с ConfigurationErrorsException, message = "Системе конфигурации не удалось инициализироваться".Что с этим делать?

Ответы [ 5 ]

4 голосов
/ 16 ноября 2011

Я бы сохранил это как отдельный файл из app.config - мне это не похоже на данные конфигурации. Вы можете использовать сериализацию Xml, Yaml, Json или даже (пожалуйста, боже, нет) двоичную сериализацию и либо сохранить ее рядом с исполняемым файлом (если у вас есть разрешения на запись там), либо где-нибудь из Environment.SpecialFolder перечисление.

1 голос
/ 16 ноября 2011

пользовательских разделов - замечательный инструмент!не используйте appSettings для серьезных приложений.

Вот код для пользовательского раздела IN WEB.CONFIG

<configuration> 
  <configSections>
    <section name="Misc" type="Config"/>    <<-- this registers a custom section called Misc
    <Misc configSource="config_misc.config"/> <<-- this says to look for for it in file "config_misc.config"
    (...)

Затем создайте файл CONFIG_MISC.CONFIG в корне вашего сайта и вставьте в него

<Misc 
    MySetting1="true" 
 />

ПОТОМ В вашем веб-приложении в папке APP_CODE создайте класс, подобный следующему:

using System;
using System.Collections;
using System.Configuration;
using System.Xml;
using System.Collections.Specialized; 


public class Config : ConfigurationSection
{
    private static string _CONFIG_SECTION = "Misc";

    #region singleton implementation
    private static Config _config;
    static Config()
    {
        _config = (Config)ConfigurationSettings.GetConfig(_CONFIG_SECTION);
    }
    #endregion 

    public static bool MySetting1
    {
        get
        {
            return _config._MySetting1;
        }
    }

    #region public properties the define the config items we are looking for
    [ConfigurationProperty("MySetting1", IsRequired = false)]
    public bool _MySetting1
    {
        get
        {
            return (bool)this["MySetting1"];
        }
    }        
    #endregion
} 

Этот код является копией моего кода, поэтому при вырезании я мог ошибиться, но он должен помочь вам начать работу.

Теперь у вас есть удивительно простой способ достичь ваших настроек просто через Config.MySetting1

Разбиение ваших настроек на большее количество файлов .config также имеет много преимуществ, особенно для обслуживания и модульности

1 голос
/ 16 ноября 2011

Да, я бы порекомендовал использовать пользовательский раздел, который дает вам гибкость, чтобы иметь структуру, которая имеет смысл для вас. Встроенные <appSettings> являются а) только строками и б) просто "плоским" списком связок ключей (и их значений).

Вам следует ознакомиться с серией из трех частей Джона Риста по настройке .NET 2.0 в CodeProject.

Настоятельно рекомендуется, хорошо написано и чрезвычайно полезно! Джон очень хорошо показывает, как создать свой собственный раздел конфигурации и как представить это в коде.

И, как уже упоминалось в jgauffin, есть также Дизайнер разделов конфигурации , который поможет вам быстро выполнить работу (но он, безусловно, поможет понять , что делает CSD - так потратьте время, прочитайте три статьи Джона, затем используйте CSD).

1 голос
/ 16 ноября 2011

ConfigurationManager - самый простой способ сделать это.Я использую это, но вот одна проблема.Вы должны знать, какой тип является значением:

<configuration>
  <appSettings>
    <add key="MyPropertyOne" value="Hello" />
    <add key="MyPropertyTwo" value="2" />
  </appSettings> 
</configuration>

string propertyOne = (string)ConfigurationManager.AppSettings["MyPropertyOne"];
int propertyTwo = (int)ConfigurationManager.AppSettings["MyPropertyTwo"];

Но вы пишете свой собственный раздел сложной пользовательской конфигурации

0 голосов
/ 16 ноября 2011
...