A Mef CompositionContainer
не может разрешить зависимости Autofac при использовании в соответствии с документацией по адресу http://docs.autofac.org/en/latest/integration/mef.html.Невозможно разрешить зависимости Autofac от Mef CompositionContainer при использовании в соответствии с документацией
У меня есть большая база кода, которая широко использует ServiceLocator и singletons ... Сервисный локатор делает все создание объектов, состав и т. Д. С помощью кешированного System.ComponentModel.Composition.Hosting.CompositionContainer
. (Также обратите внимание, что в настоящее время мы используем/нуждаемся в поддержке метаданных) Я пытаюсь перейти от этого к более современной архитектуре. Чтобы это сработало, существующий Mef-based («CompositionContainer» -сервер) должен будет сотрудничать с контейнером Autofac IoC.
Следующая функция
- Создает Мэф
CompositionContainer
- Демонстрирует, что MEF способен решить простой экспорт
- конфигурирует Autofac регистрироваться MEF и экспортировать
AutofacExport
в MEF, используя расширение.Exported
метод. - Демонстрирует, что Autofac может разрешить создание mef-компонента с зависимостями, определенными в Autofac
- Демонстрирует, что Mef не может разрешить экспортированный компонент компонента с зависимостями Autofac.
Исключение составляет: ImportCardinalityMismatchException("No exports were found that match the constraint: ContractName MefExportWithDependency RequiredTypeIdentity MefExportWithDependency"
.
public void MefResolve_ObjectWithDependency_CanResolveWhenAutofacRegistersDependeyncy2()
{
//1. Initialize Mef
var composablePartCatalogs = new List<ComposablePartCatalog>
{
new AssemblyCatalog(Assembly.GetExecutingAssembly())
//A lot more here..
};
var aggregateCatalog = new AggregateCatalog(composablePartCatalogs);
var container = new CompositionContainer(aggregateCatalog, true);
//2. As expected this is resolved
container.GetExport<MefExport>().Should().NotBeNull();
//3. Initialize Autofac
var builder = new ContainerBuilder();
builder.Register(c => new AutofacExport()).Exported(x => x.As<AutofacExport>());
builder.RegisterComposablePartCatalog(aggregateCatalog);
var ioc = builder.Build();
//4. Here Autofac is correctly providing the dependency to the mef ImportingConstructor
ioc.Resolve<MefExportWithDependency>().AutofacExport.Should().NotBeNull();
//5. The next line will throw ImportCardinalityMismatchException
container.GetExport<MefExportWithDependency>();
}
Там выше код ожидает, что следующие классы должны быть определены:
public class AutofacExport { }
[Export]
public class MefExport { }
[Export]
public class MefExportWithDependency
{
public AutofacExport AutofacExport { get; set; }
[ImportingConstructor]
public MefExportWithDependency(AutofacExport autofacExport)
{
AutofacExport = autofacExport;
}
}
Примечание: Я также имел взглянуть на https://www.nuget.org/packages/MefContrib.Integration.Autofac/ - который обещает интегрировать MEF с Autofac. Однако я не могу найти соответствующую документацию о том, как ее настроить, и пакет не имеет большого количества использования.
Спасибо! - Я боялся, что это односторонняя операция. К сожалению, я не нашел ничего, что указывало бы это в документации Autofac. Мне придется проанализировать немного больше, чтобы проверить, имеет ли смысл добавить (довольно старый) пакет MefContrib. –
Я обновил документацию, чтобы добавить немного разъяснений об этом. Фиксированный документ должен быть опубликован в ближайшее время. –
Спасибо @TravisIllig, если класс имеет атрибут ImportingContructor, делает ли это невозможным запросить другую зависимость, зарегистрированную Autofac? то есть '' 'public myClass (IMefService mefService, IAutofacService afService)' '' – Chazt3n