Интерфейс для плагинов для реализации в .Net - PullRequest
4 голосов
/ 01 ноября 2011

Я хочу внедрить систему плагинов в мое приложение .net без использования MEF.

Мое приложение загружает и создает экземпляры типов, которые содержатся в DLL.

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

Итакразные проекты нуждаются в доступе к одному интерфейсу.

Я могу реализовать это требование, поместив класс интерфейса в отдельную библиотеку классов, на которую будут ссылаться как основное приложение, так и плагины.

Это правильный способ обойти описанную проблему?

Ответы [ 2 ]

7 голосов
/ 01 ноября 2011

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

Другое решение - это решение на основе соглашения, где авторы плагиновимеют типы, которые «соответствуют» интерфейсу, например, имеют соответствующие методы в классе, на которые они могут указывать через файл конфигурации.Затем вы можете использовать отражение, генерацию IL и т. Д., Чтобы связать это с конкретным внутренним интерфейсом \ прокси.Преимущество заключается в том, что в этом случае плагины не привязаны к конкретной версии интерфейса, поэтому существует большая гибкость в управлении версиями.

Вы также можете рассмотреть возможность управления версиями, поддерживая все версии вашего интерфейса, например IPlugin_1, IPlugin_2 и т. Д.Затем разработчики плагинов могут реализовать любую версию, и вы сможете обрабатывать каждую версию.

1 голос
/ 01 ноября 2011

Мы успешно применили два различных подхода к этой проблеме в зависимости от обстоятельств на данный момент (время выхода на рынок, сложность реализации, проблемы с внутренним воздействием и т. Д.):

1) Переместите интерфейс в свою собственную DLL. Это хорошо работает, если плагинам не нужны никакие другие вспомогательные объекты / функции / данные, встроенные в вашу основную DLL-библиотеку, или если вы не хотите открывать открытые элементы в вашей основной DLL для авторов плагинов.

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

...