Это мой первый ТАК вопрос, поэтому, пожалуйста, потерпите меня...
Я пытаюсь загрузить компоненты с MEF2, используя класс ConventionBuilder. Все работает так, как ожидалось, пока мне не понадобится доступ к метаданным, доступным в виде атрибутов импортированного типа. Предположим, у меня есть следующий класс:
[RuntimeCheckAttribute("MyString1", "MyString2", MyEnum.Value1)]
class ImportedClass : IRuntimeCheck
{...}
Теперь у меня мог бы быть экземпляр ConventionBuilder, определяющий соглашение для экземпляров «IRunTimeCheck»:
ConventionBuilder conventions = new ConventionBuilder();
conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();
Затем я бы использовал экземпляр «CompositionHost», настроенный для проверки списка сборок. Звонок в
var runtimeChecks = container.GetExports<IRuntimeCheck>();
затем создаст экземпляры всех экспортированных типов «IRuntimeCheck».
Теперь мой вопрос заключается в том, как получить доступ к метаданным в типах IRunTimeCheck во время процесса экспорта. С MEF1 я мог использовать механизм ImportMany/Lazy. До сих пор я не нашел хорошего способа перестроить это поведение с помощью MEF2, поскольку все экспортные перегрузки на «CompositionHost» не позволяют мне получить доступ к атрибутам метаданных.
Мне удалось добавить метаданные на уровне ConventionBuilder с помощью AddPartMetaData:
conventions.ForTypesDerivedFrom<IRuntimeCheck>()
.AddPartMetadata("securityRuntimeMetadata", AddRuntimeCheckMetadata)
.Export(exp => exp.AsContractType<IRuntimeCheck>()).Shared();
private object AddRuntimeCheckMetadata(Type arg)
{
RuntimeCheckAttribute metadata = (arg.GetCustomAttributes<RuntimeCheckAttribute>(false) as
RuntimeCheckAttribute[]).FirstOrDefault();
if (metadata == null)
{
throw new InvalidOperationException("errorMessage");
}
return metadata;
}
Когда я отлаживаю код MEF2, я вижу, что информация о метаданных добавляется на уровне построителя соглашений. Но я не мог понять, как снова экспортировать эту информацию. Я нашел пару сообщений, которые пытаются использовать ExportFactory. Но большинство из них работают с необщим экспортом, что не является моей целью.