У меня есть сайт MVC ASP.NET, который состоит из 3 проектов в решении:
DomainModel (библиотека классов - содержит LINQ Repo),
DomainServices (библиотека классов - содержит бизнес-логику),
WebUI (ASP.NET сайт MVC)
Мне нужно место для хранения набора настроек для нашего сайта, который может быть настроен через XML.
В какой проект это должно войти? У кого-либо есть пример того, как они загружают и затем получают доступ к своим настройкам через эти различные проекты?
Я загружаю XML-файл однажды в конструкторе некоторого класса C#, который содержит свойства для всех моих настроек?
Кто-то может дать мне некоторые примеры и подсказки относительно хранения настроек в XML-файле для использования в многопроектном решении?
Настройки обычно хранятся в web.config. Все сборки имеют доступ к этим настройкам.
ConfigurationManager.AppSettings["key"]
Нужно добавить ссылку на System.configuration.dll
.Я бы хранил его в новом сервисе с интерфейсом.
У меня есть класс, у которого есть все свойства/настройки. Он также будет управлять XML файлом.
Инверсия контейнера управления позволит вам внедрять их с помощью инъекции зависимостей в другие классы.
.Я согласен с Матиасом использовать способ по умолчанию, предложенный структурой. Тем не менее, вы можете (должны, IMHO) сделать некий класс-обёртку, возможно, за интерфейсом для облегчения насмешек в юнит-тестах, например:
class MyAppSettings
{
public int SomeSetting
{
get
{
return Convert.ToInt32(ConfigurationManager.AppSettings["SomeSetting"]);
}
}
}
Define a Shared property in your class library to hold the app settings (экземпляр Specialized.NameValueCollection
). Затем в логике вашего сайта, установите это новое свойство в ваши ASP.NET настройки из web.config в подкаталоге Application_Start из global.asax.
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Code that runs on application startup
DomainModel.Common.AppSettings = ConfigurationManager.AppSettings
End Sub
Таким образом, вы можете попасть в настройки из проектов библиотек классов.
Вместо того, чтобы использовать AppSettings, который является всего лишь набором пар ключевых значений, рассмотрите возможность определения собственной структуры конфигурации с помощью ConfigurationSection или IConfigurationSectionHandler
Таким образом, вы получите всю безопасность класса-обертки, и это не загромождает ваши AppSettings (и хорошо определено где-нибудь для использования).
Еще лучше, определите вашу собственную XML схему, и используйте XmlSerialization/Deserialization для хранения этого файла вне web.config, прослушивая изменения в нем (привяжите его к кэшу, что угодно).
Если вы делаете это таким образом, вам не нужно изменять web.config для получения изменений и, следовательно, не нужно перезапускать ваше веб-приложение, теряющее сеанс/кэш в процессе работы.
Не настолько хорошо написанные веб-приложения без гражданства должны заботиться о потере сеанса/кэша - но всегда есть кто-то... :)
.