Как указать, что ни одна из реализаций интерфейса MEF не должна использоваться совместно? - PullRequest
0 голосов
/ 25 ноября 2018

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

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

В некоторых случаях интерфейсы существуют исключительно для осмысленного взаимодействия с объектами, созданными в MEF.Реализации этих интерфейсов, которые не экспортируют один и тот же интерфейс с помощью атрибута Export, не имеют никакого смысла.Я уже нашел атрибут InheritedExport , который можно разместить непосредственно на интерфейсе, что делает любую (неабстрактную) реализацию интерфейса доступной через MEF без лишних слов.

Теперь, в ситуациях, когда я не желаю, чтобы MEF сохранил одиночный код, но создавал новый экземпляр для данного интерфейса каждый раз, когда я запрашиваю его, я могу использовать атрибут PartCreationPolicy при передаче CreationPolicy.NonShared в качестве аргумента.

К сожалению, атрибут PartCreationPolicy может быть размещен только в классе, поэтому я не могу объявить его в своем интерфейсе.Кроме того, он помечен как не наследуемый, поэтому я не могу объявить его также в абстрактной базовой реализации моего интерфейса.

Как я могу указать прямо на моем интерфейсе, что любой (неабстрактный)реализации интерфейса экспортируются в MEF с политикой создания частей без общего доступа?


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

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

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


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

...