MEF экспорт репозитория <T>: IRepository <T> - PullRequest
3 голосов
/ 23 июня 2010

Я пытаюсь использовать MEF для экспорта следующего:

[Export(typeof(IRepository<>))]
public class Repository<T> : IRepository<T>
    where T : class
{

с импортом

[Import(typeof(IRepository<>))]
private IRepository<Contact> repository;

Но я продолжаю получать сообщение об ошибке при составлении MEF:

=========================================

Композиция остается без изменений. Изменения были отклонены из-за следующих ошибок: Композиция вызвала единственную ошибку композиции. Основная причина приведена ниже. Просмотрите свойство CompositionException.Errors для получения более подробной информации.

1) Не найдено допустимых экспортов, соответствующих ограничению '((exportDefinition.ContractName = "Interfaces.IRepository ()") && (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") && "Interfaces.IRepository ()". Равно (exportDefinition.Metadata.get_Item ("ExportTypeIdentity")))) ', недопустимый экспорт может быть отклонен.

Результат: невозможно установить импорт 'SoCLINQ2SQL.RepositoryTest.repository (ContractName = "Interfaces.IRepository ()") "для части" SoCLINQ2SQL.RepositoryTest ". Элемент: SoCLINQ2SQL.RepositoryTest.repository (ContractName = "Interfaces.IRepository ()") -> SoCLINQ2SQL.RepositoryTest

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

Насколько мне известно, и согласно посту Гленна Блока на эту тему, MEF не поддерживает открытые универсальные типы "из коробки".

По-видимому, есть поддержкадля него в MEF contrib проекте .

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

[Import(typeof(IRepository<Contact>))]
private IRepository<Contact> repository;
1 голос
/ 05 января 2011

У меня была похожая проблема, и она была связана с порядком, в котором сборки были добавлены в AggregateCatalog . Пример ниже иллюстрирует Bootstrapper.ConfigureAggregateCatalog () . «Модуль B» вызывал службу из «Модуль C» , но «Модуль C» не был добавлен в AggregatorCatalog еще. Мне просто пришлось изменить порядок, и это решило проблему.

    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();


 // Be aware of the order on which the assemblies are added to the AggregateCatalog.
 // It's important to add the assembly to the AggregateCatalog in the correct order, otherwise
 // you may get the error "No valid exports were found that match the constraint".
 // In the example below, if Module B invokes a method of Module C, module C must be
 // added to the AggregateCatalog prior to Module B. 
 // Please note the Bootstrapper assembly also needs to be added to the AggregateCatalog.
 // -------------------------------------------------------------------------------------- 
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleA).Assembly));
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleC).Assembly));
        this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleB).Assembly));

    }
0 голосов
/ 06 января 2011

Просто к сведению: это поддерживается в следующей версии. Предварительный просмотр должен скоро появиться на нашем сайте codeplex.

...