0

MEF を使用した既定の型の置換で説明されているように、実装 Mefmoduleinitializer を独自にオーバーライドしようとしています 。私のクラス(シェルアセンブリ内)は次のとおりです。

[Export(typeof(IModuleInitializer))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class SafeMefModuleInitializer: MefModuleInitializer
{
    private readonly IEventAggregator _eventAggregator;
    private readonly ILoggerFacade    _loggerFacade;

    [ImportingConstructor()]
    public SafeMefModuleInitializer(IServiceLocator serviceLocator, ILoggerFacade loggerFacade, DownloadedPartCatalogCollection downloadedPartCatalogs, AggregateCatalog aggregateCatalog, IEventAggregator eventAggregator) 
    : base(serviceLocator, loggerFacade, downloadedPartCatalogs, aggregateCatalog)
    {
        _eventAggregator = eventAggregator;
        _loggerFacade = loggerFacade;
    }

    public override void HandleModuleInitializationError(ModuleInfo moduleInfo, string assemblyName, Exception exception)
    {
        try {
            base.HandleModuleInitializationError(moduleInfo, assemblyName, exception);
        }
        catch (ModuleInitializeException ex) {
            _loggerFacade.Error(
                string.Format(
                    "Module {0} failed to load and has been disabled.", moduleInfo.ModuleName
                ), 
                ex
            );
            _eventAggregator.GetEvent<ModuleLoadErrorEvent>().Publish(ex);
        }
    }
}

そしてブートストラップで:

    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();

        AggregateCatalog.Catalogs.Add(
            new DirectoryCatalog(".")
        );
        AggregateCatalog.Catalogs.Add(
            new DirectoryCatalog(Properties.Settings.Default.ModuleCatalogPath)
        );
    }

実行時に MEF エラーが発生します:

"More than one export was found that matches the constraint: ContractName
Microsoft.Practices.Prism.Modularity.IModuleInitializer RequiredTypeIdentity
Microsoft.Practices.Prism.Modularity.IModuleInitializer"

MEF CompositionContainer で MefModuleInitializer を SafeMefModuleInitializer に置き換えるにはどうすればよいですか?

4

1 に答える 1