Мы используем MEF для создания классов, основанных на интерфейсах между модулями в большом приложении.(То есть интерфейсы доступны всем модулям, а классы - нет.)
По умолчанию MEF управляет реализациями этих интерфейсов как синглтонами и создает экземпляры классов только для заданного интерфейса, который они реализуют, если классукрашен соответствующим атрибутом Export
.
В некоторых случаях интерфейсы существуют исключительно для осмысленного взаимодействия с объектами, созданными в MEF.Реализации этих интерфейсов, которые не экспортируют один и тот же интерфейс с помощью атрибута Export
, не имеют никакого смысла.Я уже нашел атрибут InheritedExport
, который можно разместить непосредственно на интерфейсе, что делает любую (неабстрактную) реализацию интерфейса доступной через MEF без лишних слов.
Теперь, в ситуациях, когда я не желаю, чтобы MEF сохранил одиночный код, но создавал новый экземпляр для данного интерфейса каждый раз, когда я запрашиваю его, я могу использовать атрибут PartCreationPolicy
при передаче CreationPolicy.NonShared
в качестве аргумента.
К сожалению, атрибут PartCreationPolicy
может быть размещен только в классе, поэтому я не могу объявить его в своем интерфейсе.Кроме того, он помечен как не наследуемый, поэтому я не могу объявить его также в абстрактной базовой реализации моего интерфейса.
Как я могу указать прямо на моем интерфейсе, что любой (неабстрактный)реализации интерфейса экспортируются в MEF с политикой создания частей без общего доступа?
В настоящее время единственная альтернатива, которую я вижу, - создавать экземпляры моих объектов вручную.
По-видимому, также нет способа извлечь экспортированный тип , экземпляр которого можно создать с помощью Activator
класса (или есть? 1 ).
Поэтому мне нужно было бы создать фабричный интерфейс и заставить MEF создавать реализации этого интерфейса, при этом каждая из них по запросу создает экземпляр моего реального класса.Это, однако, сравнительно громоздкое решение, так как оно требует создания фабричного класса вместе с каждым из моих классов, которые я хотел бы получить без общего доступа из MEF.
1 : существует blogpost , который описывает способ получения экспортированных типов.Однако это происходит путем ручного сканирования и анализа содержимого каталога, что, как мне кажется, частично устраняет причину, по которой мы в первую очередь используем фреймворк, такой как MEF, вместо того, чтобы создавать собственное сканирование на основе отражений.все классы в наших двоичных файлах.