Перезагрузить параметры конфигурации из внешнего файла конфигурации во время выполнения - PullRequest
14 голосов
/ 08 февраля 2011

Я пишу игровой сервер на C # и хотел бы перезагрузить или обновить настройки из файла конфигурации во время работы сервера.

В идеале я хотел бы сохранить настройки в файле XMLвозможность редактировать файл во время работы игрового сервера, а затем отправлять серверу команду для перезагрузки настроек из файла.

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

Что мне использовать?

Ответы [ 4 ]

13 голосов
/ 08 февраля 2011

Использовать http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

Использовать пользовательский раздел конфигурации, подключить разделы из app.config к внешнему файлу (файлам) конфигурации, установив атрибут расположения этого раздела.Вся загрузка и сериализация xml выполняется этими пользовательскими классами

Код, предоставленный CarelZA :

Прежде всего, ConfigurationManager кэширует конфигурацию приложения с помощьюраздел config, и вы можете вызвать ConfigurationManager.RefreshSection (), чтобы сделать недействительным кеш для определенного раздела.

В app.config я добавил:

<configSections>
  <section name="gameSettings" 
           type="System.Configuration.NameValueSectionHandler,system , Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
</configSections>
<gameSettings configSource="game.config"/>

Я создал файл с именем «game».config "и установите для" Copy to Output Directory "значение" Копировать всегда".

В game.config:

<gameSettings>
  <add key="SettingName" value="SettingValue" />
</gameSettings>

Затем в коде, чтобыполучить доступ к любой настройке:

settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings");
return settings["SettingName"];

и перезагрузить игровой конфиг в любое время, когда команда перезагрузки отправлена ​​на сервер:

ConfigurationManager.RefreshSection("gameSettings");
4 голосов
/ 08 февраля 2011

В соответствии с просьбой опубликовать мой комментарий в качестве ответа:

Вы можете настроить его так, чтобы сервер автоматически загружал настройки файла с помощью FileSystemWatcher . Если вы используете пользовательский класс Settings, вы можете просто заблокировать класс, перезагрузить его из файла и разблокировать его (если вы используете несколько потоков).

Чтение / запись из / в файл или сериализация в .NET настолько тривиальны, что, вероятно, вам не нужна помощь, и есть много вариантов, как это сделать.

0 голосов
/ 08 февраля 2011

Проверьте MemoryCache в System.Runtime.Caching (.NET 4.0).Вы можете написать себе простой класс, который выполняет следующие шаги:

  • Загрузка XML-файла
  • Разбор его содержимого в любое представление, которое вы хотите, в
  • Сохранениевывод в кеш с HostFileChangeMonitor , наблюдающим за ним - это приведет к его автоматическому удалению из кеша при изменении файла

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

Преимущество использования такого собственного подхода заключается в том, что вы не запускаете перезапуски приложения.как в случае с AppSettings, хранящимися в ваших файлах web.config или app.config.(Следует сказать, что это не единственный способ добиться этого)

0 голосов
/ 08 февраля 2011

Звучит как работа по сериализации XML!Вместо того, чтобы вручную анализировать и редактировать XML, вы можете легко добиться того же эффекта, создав объект настроек, сериализовав его в XML и де-сериализовав его, когда вам нужно внести изменения.Таким образом, вы можете выполнить горячую замену файлов конфигурации.

using System.Xml.Serialization;

Например, вы можете получить объект

public class Settings
{
  public string SomeProperty {get; set;}
  public string SomeProperty2 {get; set;}
}

Сохранить его на диск как1009 *

var settings = new Settings {SomeProperty="Hello", SomeProperty2="Joe"};
var fs = new FileStream("settings.xml");
var xs = new XmlSerializer(settings.GetType());
xs.Serialize(fs,settings);

Прочтите это как

var fs = new FileStream("settings.xml");
var settings = (Settings)fs.Deserialize(fs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...