Доступ к web.config из отдельной библиотеки классов? - PullRequest
13 голосов
/ 04 октября 2011

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

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

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

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

Большое спасибо за любые ваши идеи.

Ответы [ 6 ]

18 голосов
/ 04 октября 2011

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

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

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

11 голосов
/ 04 октября 2011

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

2 голосов
/ 05 октября 2011

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

1 голос
/ 05 октября 2011

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

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

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);
}

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

0 голосов
/ 04 октября 2011

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

0 голосов
/ 04 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...