2009-08-20 4 views
1

Я работаю в компании, где у нас много небольших приложений ASP.Net/C#. Я прилагаю усилия для централизации максимально возможной функциональности, создавая общие библиотеки для общих функций (например, поиск в Active Directory, FTP и т. Д.).Настраиваемые общие библиотеки (DLL)

Я пытаюсь создать электронную библиотеку dll, которая будет выполнять взаимодействия SMTP. Я хотел бы сделать эту конфигурацию так, чтобы она была динамичной, но мне не нужно указывать имя SMTP-сервера, порт и т. Д. В каждом web.config.

Есть ли наилучшая практика для создания общей библиотеки, основанной на конфигурации, но не полагающейся на web.config каждого приложения? Я также предпочел бы не привязывать его к machine.config, поэтому он переносится.

Я хочу, чтобы каждое приложение, чтобы иметь возможность вызывать методы без необходимости проходить в параметрах:

EmailLib.SendEmail("[email protected]", "This is the subject",....); 

Спасибо.

ответ

0

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

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

0

Вы можете разместить свои функции электронной почты в веб-службе или службе WCF. Это позволит сохранить настройки конфигурации в одном месте.

0

Я создал библиотеку «Настройки», которая была по существу просто библиотекой namevaluepair, которая читает/записывает в таблицу db. Он достаточно гибкий, чтобы хранить много типов данных и может использоваться повторно. Вы можете легко реализовать такую ​​библиотеку в каждой из ваших других библиотек. Вызов какой-то функции, как:

AgileSetting.SetSetting("EmailSubject", "All your base are belong to us"); 
string emailSubject = AgileSetting.GetSetting("EmailSubject"); 

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

0

Я бы сказал, что в долгосрочной перспективе вы все равно не захотите использовать весь набор жестко закодированных вещей. Все ваши приложения, вероятно, будут иметь другой адрес электронной почты для поддержки и, вероятно, хотят использовать разные темы (чтобы иметь правильное описание проблемы, а не общую ошибку с приложением foo-corp).

Но что касается общей проблемы, возможно, у вас может быть файл «.properties», что общая сборка NAnt будет обрабатываться соответствующим образом в некотором роде.

2

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

Если вы действительно не хотите этого делать, вы, вероятно, находитесь в «рулоне своей» территории. В частности, я бы написал что-то, что не похоже на обычный файл конфигурации .NET, поэтому будущие сопровождающие не путаются о том, что вы делаете.

Файлы конфигурации для DLL всегда неудобны.Вы сталкиваетесь с серьезными проблемами развертывания, обслуживания, контроля версий и модульного тестирования, как только вы захотите, чтобы разные приложения имели разные настройки для файла конфигурации DLL (что является одной из основных причин, по которым параметры находятся в файле конфигурации в первую очередь , правильно?).

Как правило, настройки конфигурации относятся к приложению, а не к компоненту (-ам).

0

Я предпочитаю создавать класс конфигурации, который заполняется из внешнего файла (например, xml, dsl), хранящегося в контейнере IOC, затем вводится в службу, которая его использует. Процесс описан здесь хорошо configuration in conjunction with an IOC container

Преимущество этого в том, что я могу иметь многопользовательские конфигурации на сервер и просто вводить конфигурацию в класс для своих модульных тестов. Плюс все строго типизировано, поэтому мне нужно беспокоиться о преобразовании ints в строку или что-либо, как только приложение запустится.

Смежные вопросы