MEF открывает общие проблемы с API-интерфейсом 4.5

MEF в .NET Framework 4.5 поддерживает экспорт универсальных типов, он работает по атрибутам:

[InheritedExport(typeof(Interface1<>))]
public interface Interface1<T>
{

}

public class Type1 : Interface1<string>
{

}

Объект экспорта может быть разрешен:

AssemblyCatalog cat = new AssemblyCatalog(typeof(Program).Assembly, builder);
CompositionContainer container = new CompositionContainer(cat);

var o = container.GetExportedValue<Interface1<string>>();

Но почему это не работает, используйте базовый API соглашения:

RegistrationBuilder builder = new RegistrationBuilder();

builder.ForType<Type1>().Export(it => it.AsContractType(typeof(Interface1<>)).Inherited());

Спасибо!


person user2814166    schedule 28.05.2014    source источник


Ответы (1)


Вы хотите, чтобы контейнер создавал объект по своему интерфейсу. Но вы создаете правило для определенного типа:

builder.ForType<Type1>()

Это работает, если вы хотите сделать это:

container.GetExportedValue<Type1>();

Что вам нужно сделать, так это создать правило для этого универсального интерфейса:

    builder.ForTypesMatching(t =>
        {
            return t.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(Interface1<>));
        })
        .ExportInterfaces();
person Markus Luedin    schedule 06.06.2014