MEF InheritedExport скрывается? - PullRequest
0 голосов
/ 31 января 2011

Извиняюсь за расплывчатый вопрос.

Здесь ситуация. У меня есть ParentA в Assembly1 (библиотека классов). ParentA экспортирует typeof ParentA

Теперь другая группа разработчиков хочет переопределить некоторые действия ParentA в ChildA и развернуть сборку Assembly - Assembly2, которая содержит ссылку на Assembly1 (очевидно).

Требование заключается в том, что ParentA полностью скрыт ChildA, и все контейнеры, которые импортируют ParentA, теперь должны вместо этого получать ссылку на экземпляр ChildA. Стандартное наследование вещей.

НО - будет ли MEF экспортировать экземпляры ParentA и ChildA?

Как бы мне обойти эту ситуацию?

Ответы [ 2 ]

3 голосов
/ 04 ноября 2012

Возможно, это то, что вы искали / искали:

http://msdn.microsoft.com/en-us/library/ee155691.aspx#avoiding_discovery

Вот что он говорит:

В некоторых случаях вы можетехотите предотвратить обнаружение части как части каталога.Например, часть может быть базовым классом, предназначенным для наследования, но не использования.Есть два способа сделать это.Во-первых, вы можете использовать ключевое слово abstract в классе детали.Абстрактные классы никогда не обеспечивают экспорт, хотя они могут предоставлять унаследованные экспорты классам, производным от них.

Если класс нельзя сделать абстрактным, вы можете украсить его атрибутом PartNotDiscoverable.Часть, украшенная этим атрибутом, не будет включена ни в какие каталоги.В следующем примере демонстрируются эти шаблоны.DataOne будет обнаружено по каталогу.Поскольку DataTwo абстрактно, оно не будет обнаружено.Поскольку DataThree использовал атрибут PartNotDiscoverable, он не будет обнаружен.

<Export()>
Public Class DataOne
    'This part will be discovered 
    'as normal by the catalog.
End Class

<Export()>
Public MustInherit Class DataTwo
    'This part will not be discovered
    'by the catalog.
End Class

<PartNotDiscoverable()>
<Export()>
Public Class DataThree
    'This part will also not be discovered
    'by the catalog.
End Class
2 голосов
/ 31 января 2011

Когда MEF находит два экспорта для ClassA, когда он ожидает только одного, он выдает CompositionException, говоря, что существует проблема с количеством элементов.Он не знает, как выбирать между ними.

Существует способ обойти это: если вы передаете несколько поставщиков экспорта в контейнер, контейнер будет запрашивать каждого поставщика экспорта по очереди, когда будет искать экспорт.Первый поставщик экспорта, который предоставит часть, побеждает.

В следующем примере экспорт, предоставляемый сборками в «настраиваемой» подпапке, переопределяет экспорт, предоставляемый сборками в папке исполняемого файла.

var defaultExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(".","*"));
var customizedExportProvider = 
    new CatalogExportProvider(new DirectoryCatalog(@".\customized"));
var container = new CompositionContainer(
    customizedExportProvider, defaultExportProvider);
defaultExportProvider.SourceProvider = container;
customizedExportProvider.SourceProvider = container;

edit :

Поскольку описанное решение не является удовлетворительным, я могу только предположить, что вы используете ImportMany вместо Import.В этом случае вы все равно получите оба экспорта, и вам придется добавить к ним метаданные .Затем вы можете написать код в своем классе импорта, который решит, какой импорт является «лучшим».См. Также сообщение в блоге от Даниэль Плейстед .

...