Реализация системы плагинов / шаблонов c # - PullRequest
0 голосов
/ 27 января 2012

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

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

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

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

Мой первый вопрос: является ли это разумной реализацией?

Мой второй вопрос - как динамически ссылаться на каждый шаблон и как бы я вызывал методы этих шаблоновв нужное время?

Если бы я расширил свой проект шаблонов, добавив новый класс для каждого нового требуемого шаблона, я бы преодолел проблему динамической ссылки на шаблоны.Но если бы я хотел сохранить их в отдельных сборках ... Есть ли способ просто вставить их в проект?Не забывайте, шаблоны будут перечислены в БД, поэтому приложение будет знать о них, но как их использовать ...

ОБНОВЛЕНИЕ : я имеюпонял, как я могу динамически ссылаться на каждый класс шаблона;мне нужно указать имя, соответствующее сборке GetType : я попытался динамически сгенерировать шаблон в основном приложении:

string aqn= "MasterTemplates.TestTemplate, TestTemplate, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
MasterTemplate mt = (MasterTemplate)Activator.CreateInstance(Type.GetType(aqn));

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

А пока я кратко расскажу о предложении DBM о структуре управляемой расширяемости.

Вывод: У меня нет времени на полное расследование MEF;хотя это излишне для моих текущих потребностей, это выглядит чрезвычайно многообещающе.И я не понял, как легко разрабатывать и использовать разные сборки для разных шаблонов - вместо этого я храню все шаблоны в одной сборке, которую мне придется перекомпилировать и обновлять каждый раз, когда мне требуется новый шаблон.Не такой сложный, как альтернатива MEF, но более простой и подходящий для моих текущих потребностей.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

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

1 голос
/ 27 января 2012

При использовании активатора со строкой используйте перегрузку Activator.CreateInstance (String, String) .

В качестве альтернативы вы можете создать экземпляр типа и использовать его следующим образом:

Activator.CreateInstance(Type.GetType(templateName));
...