При организации проекта, где я должен помещать интерфейсы провайдера, которые используются в MEF? В настоящее время я просто имею их в том же проекте, что и все остальное, но мне кажется, что мне хотелось бы извлечь их в отдельную DLL, чтобы она была очень маленькой dll и с ней легко могли бы быть связаны другие, пытающиеся писать расширения. Что такое хорошая практика для этого?Где я должен поместить интерфейсы для MEF?
ответ
Как и в любой модели с подключаемым модулем/расширением, вы должны поместить свои «контракты» (интерфейсы, которые должен внедрять автор плагина) в сборке отдельно от вашего приложения.
Таким образом, вы можете сделать эту сборку доступной для авторов плагинов без необходимости передавать их всему приложению - полезно, если это коммерческое приложение, которое вам нужно лицензировать отдельно.
MEF Preview 5 представляет возможность экспорта интерфейса (т. Е. Добавить атрибут [Export] к интерфейсу), чтобы любой разработчик этого интерфейса автоматически экспортировался. Это означает, что авторам плагинов даже не нужно знать о MEF - они просто реализуют ваш интерфейс, и они автоматически являются расширением MEF.
Первоначально MEF собирался внедрить утиную печать, что означало бы, что вам не нужна общая сборка, но, видимо, это оказалось слишком сложным.
Я помещаю их в общую сборку вместе с полезными абстрактными базовыми классами, которые могут использоваться для реализации интерфейсов.
Интересно. Я сам пришел к одному и тому же образцу.Только мой интерфейс не является интерфейсом, это абстрактный класс, потому что в итоге я получил универсальную конечную функцию как настоящий код. – JCCyC
У меня также был такой же вопрос, и мне хотелось увидеть пример, где Контракты определены в одном проекте, несколько реализаций определены в других проектах и отдельные проекты потребителей, которые используют контракт и имеют папку расширения, где реализация dll's может быть просто скопирована и доступно для потребительского приложения без каких-либо изменений кода. Поэтому я попробовал написать простое приложение Hello World и опубликовал его в своем блоге. Надеюсь, вам это станет полезно. Я также разместил исходный код (в C#).
http://ppsinfo.blogspot.com/2009/11/managed-extensibility-framework-mef.html
На самом деле есть новая функция в .NET 4.0 называется тип эквивалентности, который может сделать это. С помощью этой функции вы можете создавать два разных интерфейса в разных сборках контрактов, которые сообщают CLR, что они одинаковы. Поскольку он является низкоуровневым, MEF может работать с ним хорошо.
Несколько предостережений:
- Кроме каркасных типов, только пользовательские интерфейсы поддерживаются.
- Пользовательские общие интерфейсы не поддерживаются.
- Matching требует GUID на обоих интерфейсах :-(
Вы можете прочитать об этом здесь:.. http://msdn.microsoft.com/en-us/library/dd997297(VS.100).aspx документация будет сказать, что это для COM, но вы можете использовать его для управляемого кода, а
- 1. MEF: Где я должен поставить CompositionContainer?
- 2. Где я должен поместить Database.EnsureCreated?
- 3. Где я должен поместить scriptmanager
- 4. Где я должен поместить маршрут
- 5. Где я должен поместить диспетчеров данных
- 6. Где я должен поместить надпись RDFa Events?
- 7. Rails: Где я должен поместить этот метод?
- 8. Где я должен поместить свои дефолты?
- 9. Где я должен поместить код AutoLayout?
- 10. Где я должен поместить свои тесты JUnit?
- 11. Где я должен поместить свой код инициализации?
- 12. Где я должен поместить «сборки» атрибут
- 13. Где я должен поместить свой код JavaScript?
- 14. Где я должен поместить код ag-grid?
- 15. Где я должен поместить IBOutlets и IBActions?
- 16. где я должен поместить микросхему схемы продукта
- 17. Где я должен поместить свой Partial View
- 18. Кастинг интерфейсы и MEF
- 19. git - где я должен поместить папку .git?
- 20. Где я должен поместить файл phpdoc.xml?
- 21. Где я должен поместить метод close()?
- 22. Где я должен определить свои интерфейсы для получения хорошей архитектуры?
- 23. Где я могу поместить интерфейсы и их реализацию?
- 24. Где я должен поместить файл свойств для simplelogger для slf4j?
- 25. Где я должен поместить текстовый файл для чтения netbeans?
- 26. Где я должен поместить значки для TabbedPage в Xamarin.Forms
- 27. Где я должен поместить папку шаблона для сценария bash?
- 28. Где я должен поместить метод утилиты для анализа файла PLIST?
- 29. Где я должен поместить файл для использования файла appender log4j2
- 30. Где я должен поместить свой файл журнала для приложения asp.net?
Экспорт интерфейса работает хорошо, если вы только когда-либо импортируете один из этих типов. Проблема в том, что если вы хотите использовать два из этого типа в разных частях приложения, то вам все равно потребуется имя контракта, так что вам понадобится экспорт , а? –
Да, если вам нужно импортировать две разные реализации одного и того же интерфейса, вам нужно каким-то образом их дифференцировать. Требование атрибута «Экспорт» на реализация - простой способ сделать это. Возможно, вы также можете использовать метаданные экспорта, но я вообще не играл с этим. –