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 に置き換えるにはどうすればよいですか?