Доступ к web.config из отдельной библиотеки классов?

Я ищу хороший способ добиться следующего:

У меня есть веб-приложение (MVC 3) с отдельной библиотекой классов, которая содержит внутреннюю логику CMS, которую я создаю. Эта CMS использует NHibernate для подключения к базе данных. Я хочу, чтобы пользователь мог настроить строку соединения (и в конечном итоге даже вкус базы данных) в файле web.config.

Я ищу хороший способ получить строку подключения из файла web.config, даже если DLL полностью разделена. Это возможно? Должен ли я передать мою строку подключения в библиотеку классов? Или я смогу получить к нему доступ, когда приложение запустится?

Если мне нужно создать код в моем веб-приложении, чтобы передать строку подключения в мою библиотеку классов, как я могу сделать этот код как можно более переносимым, так что мне не придется писать его снова для моего следующего webapp?

Большое спасибо за любые идеи, которые у вас есть.

Ответ 1

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

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

См. это сообщение в блоге для аргументов против прямого доступа к конфигурации (что очень часто делается, но это не самая лучшая практика).

Ответ 2

Вы можете получить доступ к System.Configuration.ConfigurationManager из вашей библиотеки классов. Это даст вам доступ к AppSettings и ConnectionStrings.

Ответ 3

У меня точно такая же настройка с проектом FOSS, с которым я связан. Он содержит все (даже контроллеры и Global.asax.cs) в библиотеке классов Core.

Там было много правильных решений, которые я выбрал, чтобы создать класс настроек, который представляет собой по существу набор статических свойств, внутри которых у вас есть:

public static string ConnectionString
{
        get { return ConfigurationManager.ConnectionStrings["MYAPP"].ConnectionString; }
}

Примечание. Убедитесь, что в библиотеке классов добавлена ​​функция System.Configuration.

Внутри вашего приложения (класса, полученного из HttpApplication) вы передаете настройки по всему, хотя вам нечего прекратить связывать настройку NH с классом настроек:

protected void Application_Start()
{
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
        SetupNHibernate();
}

public virtual void SetupNHibernate()
{
        NHibernateRepository.Current.Configure(RoadkillSettings.DatabaseType, Settings.ConnectionString, false, Settings.CachedEnabled);
}

Если это вам полезно, источник здесь.

Ответ 4

Вы можете использовать класс ConfigurationManager для доступа к элементам в файле web.config или app.config. Однако в вашей библиотеке классов обязательно укажите имя пользователя любых параметров appSettings и/или connectionString у потребителя (желательно в конструкторе). Это позволяет избежать проблемы, когда вы выбираете имя ключа, которое потребитель уже использует в другом месте.

Ответ 5

Поскольку вы используете библиотеку классов в веб-приложении MVC, она также доступна для библиотеки классов. Никаких дополнительных настроек не требуется. Несмотря на то, что библиотека классов при построении дает отдельную dll, она ссылается в текущем проекте. Таким образом, строка соединения также будет доступна для библиотеки классов.

Ответ 6

Я бы попробовал что-то вроде Autofac, чтобы дать вам некоторую реализацию IoC, которая может хранить интерфейс настроек для ваших строк подключения. Это позволит вам установить значение из файла web.config при запуске приложения или установить его в тестах на другое значение, если ваша библиотека классов никогда не должна быть связана с web.config.