Где я должен поставить интерфейсы для MEF? - PullRequest
8 голосов
/ 28 апреля 2009

При организации проекта, куда я должен поместить интерфейсы провайдера, которые используются в MEF? В настоящее время я просто использую их в том же проекте, что и все остальное, но мне кажется, что мне может потребоваться извлечь их в отдельную dll, чтобы она была очень маленькой dll и могла быть легко связана с другими, пытающимися написать расширения. Что такое хорошая практика для этого?

Ответы [ 4 ]

6 голосов
/ 28 апреля 2009

Как и для любой модели плагинов / расширений, вы должны поместить свои «контракты» (интерфейсы, которые должен реализовывать автор плагина) в сборку, отдельную от вашего приложения.

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

MEF Preview 5 предоставляет возможность экспорта интерфейса (т.е. добавления атрибута [Export] к интерфейсу), так что любой разработчик этого интерфейса автоматически экспортируется. Это означает, что авторам плагинов даже не нужно знать о MEF - они просто реализуют ваш интерфейс и автоматически становятся расширением MEF.

2 голосов
/ 22 декабря 2009

На самом деле в .NET 4.0 появилась новая функция, называемая эквивалентностью типов, которая может выполнить это. С помощью этой функции вы можете иметь два разных интерфейса в разных сборках контракта, которые сообщают CLR, что они одинаковы. Поскольку MEF низкоуровневый, с ним можно нормально работать.

Несколько предостережений:

  • Кроме типов фреймворка, поддерживаются только пользовательские интерфейсы.
  • Пользовательские универсальные интерфейсы не поддерживаются.
  • Для соответствия требуется указатель на обоих интерфейсах: - (

Подробнее об этом можно прочитать здесь: http://msdn.microsoft.com/en-us/library/dd997297(VS.100).aspx. В документации будет сказано, что это для COM, но вы можете использовать его и для управляемого кода.

1 голос
/ 15 мая 2009

Изначально в MEF планировалось вводить утку, что означало бы, что вам не нужна общая сборка, но, очевидно, это оказалось слишком сложным.

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

0 голосов
/ 09 декабря 2009

У меня тоже был такой же вопрос, и я хотел посмотреть пример, в котором Контракты определены в одном проекте, несколько реализаций определены в других проектах и ​​отдельный потребительский проект, который использует контракт и имеет папку расширений, в которую можно просто скопировать библиотеки реализации и доступно для потребительского приложения без каких-либо изменений кода. Поэтому я попытался написать простое приложение Hello World и разместил его в своем блоге. Надеюсь, вы найдете это полезным. Я также разместил исходный код (в C #).

http://ppsinfo.blogspot.com/2009/11/managed-extensibility-framework-mef.html

...