MEF + Prism: Replace existing service

Feb 18, 2011 at 10:06 AM

I try to replace the MefRegionNavigationContentLoader with customized implementation by implementing IRegionNavigationContentLoader.

[Export(typeof(IRegionNavigationContentLoader))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class MefResolvingRegionNavigationContentLoader : ResolvingRegionNavigationContentLoader
{

        [ImportingConstructor]
        public MefResolvingRegionNavigationContentLoader(IViewViewModelResolver resolver) : base(resolver)
        {
        }
 }

 

But when the implementation is about to be instanciated via calling  IRegion.RequestNavigate(...) I get an ActivationException. Probably this is caused by having two exports for .IRegionNavigationContentLoader. The debug output is partly in german.  1) means:  More than one export implementing IRegionNavigationContentLoader was found.

System.ComponentModel.Composition Warning: 1 : Die ComposablePartDefinition "Microsoft.Practices.Prism.MefExtensions.Regions.MefRegionNavigationService" wurde zurückgewiesen. Die Komposition bleibt unverändert. Die Änderungen wurden aufgrund der folgenden Fehler zurückgewiesen: Bei der Komposition ist ein Kompositionsfehler aufgetreten. Die Ursache wird unten angegeben. Die CompositionException.Errors-Eigenschaft liefert genauere Informationen.

1) Es wurde mehr als ein Export gefunden, der der Einschränkung "((exportDefinition.ContractName == "Microsoft.Practices.Prism.Regions.IRegionNavigationContentLoader") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "Microsoft.Practices.Prism.Regions.IRegionNavigationContentLoader".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))" entspricht.

Ergebnis: Import "Microsoft.Practices.Prism.MefExtensions.Regions.MefRegionNavigationService..ctor (Parameter="navigationContentLoader", ContractName="Microsoft.Practices.Prism.Regions.IRegionNavigationContentLoader")" kann nicht für Teil "Microsoft.Practices.Prism.MefExtensions.Regions.MefRegionNavigationService" festgelegt werden.
Element: Microsoft.Practices.Prism.MefExtensions.Regions.MefRegionNavigationService..ctor (Parameter="navigationContentLoader", ContractName="Microsoft.Practices.Prism.Regions.IRegionNavigationContentLoader") -->  Microsoft.Practices.Prism.MefExtensions.Regions.MefRegionNavigationService -->  AssemblyCatalog (Assembly="Microsoft.Practices.Prism.MefExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

Eine Ausnahme (erste Chance) des Typs "Microsoft.Practices.ServiceLocation.ActivationException" ist in Microsoft.Practices.ServiceLocation aufgetreten.

 

How to get out of this? How can I hide prisms original implementation? Is there a way to configure this in the bootstrapper?

Feb 18, 2011 at 11:14 AM

Sorry, I detected my mistake.

I added the Microsoft.Practices.Prism.MefExtensions assembly to the AggregateCatalog.

This lead to a regular export of MefRegionNavigationContentLoader and forces a behaviour that didn't follow the documentation of MefRegionNavigationContentLoader:

  "This allows the MefBootstrapper to provide this class as a default implementation. If another implementation is found, this export will not be used."