Система с плагинами в C#

Соединения разрываются, так бывает. Брандмауэр, маршрутизатор с поддержкой NAT и т. Д. Могут способствовать тому, чтобы это происходило чаще, чем следовало бы, но вы все равно не хотите, чтобы ваша программа вылетала.

Итак, в общем, прежде чем выполнить запрос, он должен выполнить проверку соединения и отловить все исключения соединения. когда пойман, перезагрузите соединение. К счастью, это знакомая концепция, называемая пулом, и она уже доступна через разъем.

Извлечено из https://dev.mysql.com/doc/connector-python/en/connector-python-connection-pooling.html :

Создать неявный пул соединений: откройте соединение и укажите один или несколько аргументов, связанных с пулом (pool_name, pool_size). Например:

dbconfig = {
  "database": "test",
  "user":     "joe"
}

cnx = mysql.connector.connect(pool_name = "mypool",
                              pool_size = 3,
                              **dbconfig)
blockquote>

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

9
задан Peter Mortensen 17 September 2013 в 19:45
поделиться

6 ответов

Существует огромное количество специальных сменных систем для C#. Каждый описан в Сменной Архитектуре с помощью C#Проекте Кода). Общий подход - то, что хост-приложение публикует блок с интерфейсами. Это перечисляет через папку и находит блоки, которые определяют класс, которые реализуют его интерфейсы, и загружает их и инстанцирует классов.

На практике Вы хотите сделать больше. Лучше, если хост-приложение определяет два интерфейса, IHost и IPlugIn. Интерфейс IHost предоставляет услуги, на которые может подписаться плагин. IPlugIn получает созданное взятие IHost.

Для загрузки плагина необходимо сделать, больше, чем просто получают плагин. Необходимо перечислить все плагины, которые являются загружаемыми. Создайте их каждый. Спросите их, если они могут работать. Попросите, чтобы они экспортировали API в хост. Попросите, чтобы они импортировали API из хоста. Плагины должны смочь спросить о существовании других плагинов.

Таким образом, плагины могут расширить приложение путем предложения большего количества API.

PlugIns должен включать события. Таким образом, плагины могут контролировать процесс загрузки и разгрузки плагинов.

В конце мира необходимо предупредить плагины, что они собираются уйти. Затем выньте их.

Это оставит Вас с приложением, которое может быть записано в крошечной платформе и реализовано полностью в плагинах, если Вы хотите это к.

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

10
ответ дан 4 December 2019 в 08:53
поделиться

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

9
ответ дан 4 December 2019 в 08:53
поделиться

Каждый датчик должен реализовать стандартный интерфейс так, чтобы стандартные программы, которые обрабатывают списки датчиков, могли рассматривать их стандартным способом. Включайте поле ID в интерфейс, который уникален также каждый тип датчика, таким образом, можно обработать особые случаи.

Посмотрите на API Reflection, чтобы изучить, как просканировать каталог блоков.NET и взгляда в них.

Каждый блок должен иметь класс фабрики, что это - задание, должен возвратить список датчиков, которые находятся в том блоке. Я рекомендую сделать это подпрограммой не функция, и передает его список это, что это добавляет также. SensorDLL1 добавляет 4 датчика к emptylist, SensorDLL2 добавляет 8 датчиков к списку, который теперь имеет 12 датчиков и так далее. Этот подход является самым гибким в конечном счете.

Необходимо будет или составить соглашение о присвоении имен найти класс фабрики или использовать атрибут. Обратите внимание, что я не рекомендую просто сканировать блок для всего, что реализует Ваш интерфейс датчика, поскольку у Вас мог быть код в фабрике, которая управляет, какие датчики доступны. Это полезно для лицензирования.

3
ответ дан 4 December 2019 в 08:53
поделиться

В зависимости от самих Датчиков это кажется, что необходимо было бы определить единственный интерфейс, который реализуют все Датчики. Ваш основной "скелет приложения" будет затем работать против интерфейса ISensor и не должен интересоваться конкретными реализациями каждого из классов/объектов/компонентов Датчика.

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

Некоторые ссылки, которые могут помочь здесь:

Шаблон разработки шаблона "команда": - http://en.wikipedia.org/wiki/Command_pattern

Шаблон разработки шаблона "наблюдатель": - http://en.wikipedia.org/wiki/Observer_pattern

Динамично загружающиеся блоки: - http://www.divil.co.uk/net/articles/plugins/plugins.asp

Надеюсь, это поможет.

1
ответ дан 4 December 2019 в 08:53
поделиться

Мы когда-то сделали сменную систему в школьном нашем проекте в 2006, Социо. Можно найти код здесь и здесь.

Основной извлеченный урок был то, что это должно очень просто динамично загрузить код в C#. Если у Вас просто есть сменный DLL и приложение, которое придерживается вашего интерфейса и связывается против общего DLL, в котором тот интерфейс существует, это просто works™.

В сущности это - то, что постамент описал в его ответе.

1
ответ дан 4 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: