Шаблон плагина в C # - PullRequest
       25

Шаблон плагина в C #

6 голосов
/ 16 августа 2011

Проблема:
Я создаю фреймворк, который принимает файл, переводит это и выполняет это. Фреймворк должен иметь возможность обрабатывать файлы любого типа, для этого я предоставил метод загрузки DLL, содержащей классы и методы для преобразования и выполнения файла. То, что я ищу, это лучший способ определить интерфейс плагина

Решение A:
Определите набор интерфейсов, которые являются общедоступными. Плагины должны реализовывать эти интерфейсы.

Решение B:
Определите некоторые абстрактные классы, которые являются общедоступными. Плагины должны наследовать и переопределять абстрактные методы в этих классах.

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

Решение D: Джей и Крис Шейн
Реализовать составную среду (например, Managed Extensibility Framework (MEF) ) и построить вокруг нее

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

Заранее спасибо,
Tech Test Dude

Ответы [ 3 ]

4 голосов
/ 16 августа 2011

То, что вы пишете, звучит подозрительно, как то, что поддерживает Managed Extensibility Framework: http://mef.codeplex.com/. Может быть, просто использовать это и избежать повторного изобретения колеса?

3 голосов
/ 16 августа 2011

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

Вы можете предоставить некоторые abstract методы, которые необходимы для определения конкретного поведения плагина, в то время как virtual методы предлагают способ optionnaly переопределить поведение по умолчанию.

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

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

3 голосов
/ 16 августа 2011

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

...