Используйте классы из другой сборки MEF, не ссылаясь на нее - PullRequest
3 голосов
/ 09 июня 2011

У меня есть 2 компонента MEF. Пусть это будет компонент A и компонент B.

Мне нужно иметь доступ к классу из компонента B в компоненте A без ссылки на него. Тогда я бы хотел создать экземпляр объекта класса вручную.

В настоящее время я вижу, что MEF позволяет создавать экземпляры объекта автоматически, используя [Import]. Он использует интерфейс, на который необходимо ссылаться.

Можно ли использовать типы данных из других сборок, не ссылаясь на них? Есть ли такой механизм, поддерживаемый MEF?

Ответы [ 3 ]

1 голос
/ 10 июня 2011

Вы можете создать экземпляр класса с помощью отражения , не имея жесткой ссылки на файл.Вам не нужен MEF для этого.

0 голосов
/ 10 июня 2011

Есть несколько способов сделать это.

Во-первых, вам нужно определить общий интерфейс, который понимают обе сборки.Это может быть библиотека «PublicInterfaces», на которую ссылаются обе эти сборки, или она может быть внутри сборки A (B ссылается на A, но не наоборот).

В B экспортируйте тип, используя этуinterface.

B должен быть в каталоге контейнера.Либо ссылаться на сборку B явно в AssemblyCatalog, либо создать DirectoryCatalog и указать его на каталог, который будет содержать сборку B.

В A вместо использования атрибутов импорта в вызове кода GetExportedValue<T>()на контейнере.Код выглядит примерно так:

// Known by A and B
public interface CommonInterface 
{
   // ...
}

// In B, not A
[Export(typeof(CommonInterface))]
public class BClass : CommonInterface
{
   // ...
}

// In A where you want to manually create class B
CommonInterface objB = _container.GetExportedValue<CommonInterface>();
0 голосов
/ 09 июня 2011

Тогда я бы хотел создать экземпляр объекта класса вручную.

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

...