3

我正在尝试在使用 MEF 加载一些插件并寻找解决此特定异常的想法的 WPF 应用程序上调试程序集导入问题:

找到多个与约束匹配的导出:
ContractName MarkPad.Contracts.ISpellingService
RequiredTypeIdentity MarkPad.Contracts.ISpellingService

只有一个程序集直接引用关注的插件作为它的 autofac 注册的一部分(最后的代码片段)。

[ImportingConstructor]
public SpellCheckPlugin(
    IPluginSettingsProvider settingsProvider,
    ISpellingService spellingService,
    ISpellCheckProviderFactory spellCheckProviderFactory)

只有 1 个实现ISpellingService

[Export(typeof(ISpellingService))]
public class SpellingService : ISpellingService

这是github 上的一个开源Code52 项目。

插件导入为:

[ImportMany]
IEnumerable<IPlugin> plugins;

到目前为止我已经尝试过:

  1. 这篇博客文章都提到了使用[ImportMany(AllowRecomposition = true)],但这似乎也没有帮助。
  2. 我发现的其他讨论提到将“复制本地”设置为 false,但因为它实际上用于注册代码,这不是一个选项,因为它最终不会出现在输出文件夹中。

有任何想法吗?

引用插件的注册码

builder.RegisterType<SpellingService>().As<ISpellingService>()
    .SingleInstance()
    .OnActivating(args =>
{
    var settingsService = args.Context.Resolve<ISettingsProvider>();
    var settings = settingsService.GetSettings<SpellCheckPlugin.SpellCheckPluginSettings>();
    args.Instance.SetLanguage(settings.Language);
})
4

1 回答 1

3

解决方案

问题是当前程序集通过GetExecutingAssembly在 PluginManager() 中用作AggregateCatalog提供给CompositionContainer.

var catalog = new AggregateCatalog();

// This was causing the composition to detect additional imports
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));

这个错误来自于将服务/插件提取到它们自己的程序集中,这些程序最初是核心 MarkPad 程序集的一部分。

归功于 @shiftkey和这个补丁

额外的改进

作为这个补丁的一部分,有一些额外的清理可能有助于支持这个答案。

由于 SpellCheckPlugin 采用接口,因此导出只是移动到接口本身而不是具体类型。

[ImportingConstructor]
public SpellCheckPlugin(
    IPluginSettingsProvider settingsProvider,
    ISpellingService spellingService,
    ISpellCheckProviderFactory spellCheckProviderFactory)

改为在接口上添加导出

[InheritedExport]
public interface ISpellCheckProviderFactory

// and

[InheritedExport]
public interface ISpellingService  

删除混凝土出口

[Export(typeof(ISpellingService))]
public class SpellingService : ISpellingService

// and

[Export(typeof(ISpellCheckProviderFactory))]
public class SpellCheckProviderFactory : ISpellCheckProviderFactory
于 2012-07-16T13:05:25.613 回答