2010-07-25 1 views
5

Мое приложение должно быть расширяемым. Для моих собственных нужд я реализую некоторые сервисы. Эти службы основаны на принципе IoC/DI. Таким образом, службы инкапсулируют концепцию приложения.Рекомендации по реализации стратегии addin/addon/plugin

Для примера используется служба IApplicationService. ApplicationService предоставляет информацию о текущем exceuting приложении. Указаны AssemblyInfo и т. Д. Другим примером является INavigationService (см. Mef.codeplexcom в образцах). Эти службы предоставляют некоторые свойства, где указаны информация о текущем выбранном элементе, а также некоторые события.

Я думаю, что «сервисный подход» является самым простым и упрощает точки расширения для приложения. Поэтому я не уверен, что это действительно лучший подход. Как вы думаете? Как реализовать «точки расширения» в приложении, например, addins/addons/plugins ...?

Заранее благодарю за ваши ответы! И извините, мой английский плохой. ;)

ответ

4

Вы знакомы с MEF (управляемая расширяемость)?

Рамка управляемой расширяемости (или MEF для краткости) упрощает создание расширяемых приложений. MEF предлагает возможности обнаружения и компоновки, которые вы можете использовать для загрузки расширений приложений.

2

Вам действительно нужно взглянуть на MEF - управляемую расширяемость.

Это отличная новая структура, которая сама Microsoft использует в, например, Visual Studio 2010 для истории расширяемости. Отличный и простой в использовании - зачем изобретать колесо, когда вы можете использовать что-то, что тысячи разработчиков будут использовать в ближайшее время?

0

Да, я знаком с MEF. Я также использую концепцию MEF, но есть некоторые недостатки. Мое приложение IoC/DI нравится и вместе с MEF немного сложнее. MEF не является контейнером DI, поэтому использовать MEF с другим контейнером DI (например, ninject, unity, ...) трудно. Я не буду использовать MEF с другими контейнерами DI. Поэтому смешивать MEF с другими контейнерами DI не очень хорошо.

Надеюсь, вы поймете мою озабоченность.

Дополнение: Невозможно загрузить расширения в AppDomain в MEF. Так что это для моих нужд не очень хорошо. System.AddIn или MAF поддерживает это, но я не буду использовать System.AddIn, потому что это очень тяжело ....

+2

Если вы хотите добавить информацию, пожалуйста ** обновите ** свое исходное сообщение, отредактировав его - не добавляйте свой собственный ответ - затрудняет его выполнение ... –

+0

Да, MEF ** ** ** DI - поскольку его работа отличается от контейнера DI. Но я не согласен - смешивание MEF и контейнера DI (например, StructureMap или Unity) действительно не так сложно и может быть сделано довольно хорошо. Возможно, вам нужно будет объяснить более подробно, почему вы не думаете, что это сработает для oyu ..... –

+0

Управление загрузкой в ​​AppDomain является нетривиальным, и я не думаю, что большинство инфраструктур DI также справятся с этим. Все ваши сервисы должны быть проксимированы, чтобы пересечь границу AppDomain, что также означает, что все классы, которые проходят туда и обратно, должны быть либо MarshalByRef, либо Serializable.Вы можете подумать о наличии одной категории «доверенных» расширений (без маршалинга) и другой категории «ненадежных» расширений, которые получают доступ только к ограниченному числу услуг с маршалированием. –