/// <summary> /// Enables Managed Extensibility Framework two-way integration. /// </summary> /// <param name="unityContainer">Target container.</param> /// <returns> /// <see cref="CompositionIntegration"/> instance. /// </returns> public static CompositionIntegration EnableCompositionIntegration( this IUnityContainer unityContainer) { lock (unityContainer) { var extension = unityContainer.Configure <CompositionIntegration>(); if (extension == null) { var adapter = new UnityContainerAdapter(unityContainer); var containerExportProvider = new ContainerExportProvider(adapter); var parentExtension = (CompositionIntegration)null; if (unityContainer.Parent != null) { parentExtension = unityContainer.Parent.Configure <CompositionIntegration>(); } if (parentExtension != null) { // Get the parent ContainerExportProvider var parentContainerExportProvider = (ContainerExportProvider)parentExtension.Providers.Where( ep => typeof(ContainerExportProvider).IsAssignableFrom(ep.GetType())).First(); // Collect all the exports provided by the parent container and add // them to the child export provider foreach (var definition in parentContainerExportProvider.FactoryExportProvider.ReadOnlyDefinitions) { containerExportProvider.FactoryExportProvider.Register( definition.ContractType, definition.RegistrationName); } // Grab all the parent export providers except the container ones var parentExporters = new List <ExportProvider>( parentExtension.Providers.Where( ep => !typeof(ContainerExportProvider).IsAssignableFrom(ep.GetType()))) { containerExportProvider }; var catalog = new AggregateCatalog(parentExtension.Catalogs); extension = new CompositionIntegration(true, parentExporters.ToArray()); extension.Catalogs.Add(catalog); } else { extension = new CompositionIntegration(true, containerExportProvider); } unityContainer.AddExtension(extension); } return(extension); } }
/// <summary> /// Enables Managed Extensibility Framework two-way integration. /// </summary> /// <param name="unityContainer">Target container.</param> /// <returns> /// <see cref="CompositionIntegration"/> instance. /// </returns> public static CompositionIntegration EnableCompositionIntegration( this IUnityContainer unityContainer) { lock (unityContainer) { var extension = unityContainer.Configure<CompositionIntegration>(); if (extension == null) { var adapter = new UnityContainerAdapter(unityContainer); var containerExportProvider = new ContainerExportProvider(adapter); var parentExtension = (CompositionIntegration) null; if (unityContainer.Parent != null) { parentExtension = unityContainer.Parent.Configure<CompositionIntegration>(); } if (parentExtension != null) { // Get the parent ContainerExportProvider var parentContainerExportProvider = (ContainerExportProvider)parentExtension.Providers.Where( ep => typeof(ContainerExportProvider).IsAssignableFrom(ep.GetType())).First(); // Collect all the exports provided by the parent container and add // them to the child export provider foreach (var definition in parentContainerExportProvider.RegistrationBasedFactoryExportProvider.ReadOnlyDefinitions) { containerExportProvider.RegistrationBasedFactoryExportProvider.Register( definition.ContractType, definition.RegistrationName); } // Grab all the parent export providers except the container ones var parentExporters = new List<ExportProvider>( parentExtension.Providers.Where( ep => !typeof (ContainerExportProvider).IsAssignableFrom(ep.GetType()))) { containerExportProvider }; var catalog = new AggregateCatalog(parentExtension.Catalogs); extension = new CompositionIntegration(true, parentExporters.ToArray()); extension.Catalogs.Add(catalog); } else { extension = new CompositionIntegration(true, containerExportProvider); } unityContainer.AddExtension(extension); } return extension; } }