Re: Конфигурирование .NET-приложений
От: Tom Россия http://www.RSDN.ru
Дата: 20.09.04 16:56
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья :



АК>Авторы :

АК>Андрей Корявченко

АК>Аннотация :

АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....

Хочется добавить:
1. Использовать при XML серилизации таки нужно XmlTextReader/XmlTextWriter иначе буду проблеммы с национальными символами.
2. Можно упомянуть как десериализуется тип, если он не найден (массив елементов XmlAttribute и XmlElement)
3. Можно упомянуть о XmlDeserializationEvents (так как это вообще в MSDN не описано)
Народная мудрось
всем все никому ничего(с).
Re[2]: Конфигурирование .NET-приложений
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.04 23:31
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>... Можно упомянуть...


Да ты упомянай, не стесняйся.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Конфигурирование .NET-приложений
От: Tom Россия http://www.RSDN.ru
Дата: 21.09.04 11:48
Оценка:
VD>Да ты упомянай, не стесняйся.
Это как? Я же не могу статью АВК править...
Народная мудрось
всем все никому ничего(с).
Re[4]: Конфигурирование .NET-приложений
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.09.04 18:21
Оценка: +1
Здравствуйте, Tom, Вы писали:

VD>>Да ты упомянай, не стесняйся.

Tom>Это как? Я же не могу статью АВК править...

Так ты тут и описывай. Не сомневайся, те кого заинтересовала эта статья с удовольствием прочтут и ее обсуждение.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Конфигурирование .NET-приложений
От: Аноним  
Дата: 15.06.05 14:26
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья :

АК>Конфигурирование .NET-приложений
Автор(ы): Андрей Корявченко
Дата: 12.05.2003
Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru.


АК>Авторы :

АК>Андрей Корявченко

АК>Аннотация :

АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....

Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.
Re[2]: Конфигурирование .NET-приложений
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.06.05 14:51
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.


Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.

P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.
... << RSDN@Home 1.2.0 alpha rev. 475>>
AVK Blog
Re[2]: Конфигурирование .NET-приложений
От: Andre Украина  
Дата: 15.06.05 14:51
Оценка:
А>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.

        [Editor(typeof (FolderEditor), typeof (UITypeEditor))]
        public string SomeFolder
        {
            get { return _someFolder; }
            set    { _someFolder = value; }
        }

        private class FolderEditor : FolderNameEditor
        {
            protected override void InitializeDialog(FolderBrowser fbd)
            {
            }
        }
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Я бы изменил мир — но Бог не даёт исходников...
Re[3]: Конфигурирование .NET-приложений
От: Аноним  
Дата: 15.06.05 15:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, <Аноним>, Вы писали:


А>>Спасибо за статью, все работет превосходно. Один вопрос. Я храню в свойстве путь к некоторой папке. Хотелось бы это значение в PropertyGrid ну руками, а с помощью FolderBrowserDialog писать. Как это можно устроить? Благодарю.


AVK>Если скачать исходники януса (http://rsdn.ru/projects/VcsStatus.aspx?project=janus), то там можно увидеть пример (свойство, которое содержит путь к звуковому файлу). Если лень разбираться, то смотреть классы EditorAttribute и UITypeEditor.


AVK>P.S. Скачать свежие исходники януса в любом случае стоит, поскольку PropertyGridCustomizer был существенно переделан с тех пор.





Огромное спасибо, буду разбираться дальше.
Re[3]: Конфигурирование .NET-приложений
От: Аноним  
Дата: 15.06.05 17:59
Оценка:
Здравствуйте, Andre, Вы писали:

A>
A>        [Editor(typeof (FolderEditor), typeof (UITypeEditor))]
A>        public string SomeFolder
A>        {
A>            get { return _someFolder; }
A>            set    { _someFolder = value; }
A>        }

A>        private class FolderEditor : FolderNameEditor
A>        {
A>            protected override void InitializeDialog(FolderBrowser fbd)
A>            {
A>            }
A>        }
A>



не могу понять. добавил:

using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

пишет:

The type or namespace name 'FolderNameEditor' could not be found (are you missing a using directive or an assembly reference?)

почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design
Re[4]: Конфигурирование .NET-приложений
От: Andre Украина  
Дата: 15.06.05 18:23
Оценка:
А>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design

Добавь в проекте референс на System.Design
... << RSDN@Home 1.1.4 beta 7 rev. 0>> :: silent
Я бы изменил мир — но Бог не даёт исходников...
Re[5]: Конфигурирование .NET-приложений
От: Аноним  
Дата: 15.06.05 19:02
Оценка:
Здравствуйте, Andre, Вы писали:

А>>почему он не видит 'FolderNameEditor'? ведь этот класс находится в System.Windows.Forms.Design


A>Добавь в проекте референс на System.Design




уже нашел, спасибо.
Re: Конфигурирование .NET-приложений
От: MatFiz Россия  
Дата: 05.02.06 13:30
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

АК>Статья :

АК>Конфигурирование .NET-приложений
Автор(ы): Андрей Корявченко
Дата: 12.05.2003
Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru.


АК>Авторы :

АК>Андрей Корявченко

АК>Аннотация :

АК>Не секрет, что практически каждое приложение требует каких-то настроек. Данная статья рассказывает об одном из возможных способов реализации механизма их хранения и редактирования. Исходные коды взяты из реального приложения, RSDN@Home, оффлайн-клиента для форумов www.rsdn.ru....


Нашли маленькую багу.
Всем, кто бездумно воспользовался кодом статьи, рекомендую почитать здесь
Автор: VVitaliy
Дата: 03.02.06
How are YOU doin'?
Re: Конфигурирование .NET-приложений
От: Ник  
Дата: 23.04.06 20:47
Оценка:
Здравствуйте, Андрей Корявченко.

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

Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом:
public static string pathToTTLibrary;
Код для инициализации этой переменной-члена я добавил сюда:
catch (Exception e)
{
   //Если не удалось десериализовать то просто создаем новый экземпляр
   instance = new Config();
   pathToTTLibrary = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
}


Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?
Re[2]: Конфигурирование .NET-приложений
От: Варвар США  
Дата: 24.04.06 16:01
Оценка: 2 (1)
Здравствуйте, Ник, Вы писали:
Ник>Вот я добавляю свои атрибуты в тело класса, выше тэга [XmlIgnore], таким образом:
Ник>public static string pathToTTLibrary;
Поля твоей конфигурации не должны быть статическими.
В коде можно использовать так:
string path = Config.Instance.pathToTTLibrary;


Ник>Дальше я в определенном месте программы пытаюсь этот атрибут считать. Поскольку никаких конструкторов не указано, то у меня Config.pathToTTLibrary является null, независимо от того, вызываю я Config.Reload() перед этим, или нет. Что я должен был сделать, чтобы он не был null? Я не понимаю фразу "Для перезагрузки настроек достаточно обнулить поле instance. При следующем обращении настройки будут заново загружены с диска." Почему? Как именно нужно это "обращение" осуществить, чтобы чтение произошло?

По моему ты не понял что такое Instance. Данный класс является синглтоном. Свойство Config.Instance при первом вызове создаёт и возвращает объект типа Config. В процессе создания он его десереализует из файла и сохраняет ссылку на него во внутреннем статическом поле instance. При последующих вызовах просто возвращает этот объект (design patern singlton). Таким образом если обнулить поле instance, то при следующем обращении к Config.Instance, объект будет заного создан (считан).

  public static Config Instance
  {
    get
    {
      lock(lockFlag) 
      {
        if(instance == null)
        {     
          try
          {
            //Пытаемся загрузить файл с диска и десериализовать его
            using(FileStream fs = 
                new FileStream(LocalUser.GetDatabasePath()
                + "\\config.xml",FileMode.Open))
            {
              System.Xml.Serialization.XmlSerializer xs = 
                  new System.Xml.Serialization.XmlSerializer(typeof(Config));
              instance = (Config)xs.Deserialize(fs);
            }
          }
          catch(Exception e)
          {
            //Если не удалось десериализовать то просто создаем новый экземпляр
            instance = new Config();
          }
        }
      }
      return instance;
    }



Надеюсь понятно...
И вместо сердца каменный топор...
Re: Конфигурирование .NET-приложений
От: Ed.ward Россия  
Дата: 25.04.06 11:55
Оценка:
Привет всем

У меня такой вопрос, был экземпляр класса сеарилизуемый в config.

В след. версии программы в этом классе добавилась и убралась пара полей.
Как пройдет десериализация?

Рухнет или новые поля просто инициируются значениями по умолчанию?

Ed.ward
Re[2]: Конфигурирование .NET-приложений
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.04.06 12:17
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.


EW>В след. версии программы в этом классе добавилась и убралась пара полей.

EW>Как пройдет десериализация?

EW>Рухнет или новые поля просто инициируются значениями по умолчанию?


Если просто удалились/добавились, то да. Проблемы будут только с удалением/переименованием элементов enum и в смене типа свойст.
... << RSDN@Home 1.2.0 alpha rev. 642>>
AVK Blog
Re[2]: Конфигурирование .NET-приложений
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.06 09:27
Оценка:
Здравствуйте, Ed.ward, Вы писали:

EW>Привет всем


EW>У меня такой вопрос, был экземпляр класса сеарилизуемый в config.


EW>В след. версии программы в этом классе добавилась и убралась пара полей.

EW>Как пройдет десериализация?

EW>Рухнет или новые поля просто инициируются значениями по умолчанию?

Отсутствующие поля останутся инициализированы значениями по умолчанию.

Неизвестные ноды вызовут ошибку. Чтобы ее не было, можно в новой версии класса добавить специального мембера:
[XmlAnyElenent]
[Obsolete("Never access this member directly", true)]
public XmlElement[] Deprecated
{
 get { return null;}
 set { }
}
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Конфигурирование .NET-приложений
От: Ник  
Дата: 01.05.06 09:45
Оценка:
Здравствуйте, Варвар, Вы писали:

В>Поля твоей конфигурации не должны быть статическими.

В>В коде можно использовать так:
В>
В>string path = Config.Instance.pathToTTLibrary;
В>

В>Надеюсь понятно...

Большое спасибо, теперь я понял.
Re: Конфигурирование .NET-приложений
От: alexdp Украина  
Дата: 12.05.06 14:09
Оценка:
Здравствуйте, Андрей Корявченко, Вы писали:

Спасибо.
Интересная статья.

Но у меня код не работает. Ругается на LocalUser.GetDatabasePath().
2003 студия. МСДН тоже такого метода не знает.

Ну ладно, я его в обеих местах поменял на

//new FileStream(LocalUser.GetDatabasePath()
  new FileStream("d:"
  + "\\config.xml",FileMode.Open))


Скомпилировался.

Но работать не работает.
Сохраняет фал со следующим содержимым

<?xml version="1.0"?>
<Config xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />

Как видите, моих переменных там нет.

Что я делаю не так.

Вот код.



public class Config
    {
        //[XmlTextAttribute]
        public string strTest22= "hello";

        public string MyStr ;
    
        //[XmlElement(Namespace="http://www.cohowinery.com")]
        public int t1=3;
        
        //[XmlElement(Namespace="http://www.cohowinery.com")]
        public int t2=4;
        private static object lockFlag = new object();
        private static Config instance;
        [XmlIgnore]
        public static Config Instance
        {
            get
            {
                lock(lockFlag) 
                {
                    if(instance == null)
                    {     
                        try
                        {
                            //Пытаемся загрузить файл с диска и десериализовать его
                            using(FileStream fs = 
                                      //new FileStream(LocalUser.GetDatabasePath()
                                      new FileStream("d:"
                                      + "\\config.xml",FileMode.Open))
                            {
                                System.Xml.Serialization.XmlSerializer xs = 
                                    new System.Xml.Serialization.XmlSerializer(typeof(Config));
                                instance = (Config)xs.Deserialize(fs);
                            }
                        }
                        catch(Exception e)
                        {
                            //Если не удалось десериализовать то просто создаем новый экземпляр
                            instance = new Config();
                        }
                    }
                }
                return instance;
            }
        }

        public static void Reload()
        {
            instance = null;
        }


        public void Save()
        {
            using(FileStream fs = 
                      new FileStream("d:"
                      //new FileStream(LocalUser.GetDatabasePath()
                          +"\\config.xml",FileMode.Create))
            {
                System.Xml.Serialization.XmlSerializer xs = 
                    new System.Xml.Serialization.XmlSerializer(typeof(Config));
                xs.Serialize(fs,instance);
            }
        }

    //[XmlTextAttribute]
    public string strTest= "hello";

    }
Re: Конфигурирование .NET-приложений
От: alexdp Украина  
Дата: 12.05.06 14:10
Оценка:
А у кого-то есть работающий код єтого класса, без графической части?

Киньте в меня, если не жалко.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.