0

我有一个项目,其中包含两个模块,一个基础设施(Common库)和Shell.

在此处输入图像描述

注意Common有一个FooService,这个有一个ExportAttribute

[Export]
public class FooService
{
}

这个应该由Module1and使用Module2,但是如果我有ImportAttribute. 请注意评论。

[ModuleExport("Module1.ModuleInit", typeof(Module1.ModuleInit))]
public class ModuleInit : IModule
{
    private readonly IRegionManager _regionManager;
    public IServiceLocator _serviceLocator;

    // [Import(AllowRecomposition=true)]
    public FooService _service;

    [ImportingConstructor]
    public ModuleInit(IRegionManager regionManager, IServiceLocator serviceLocator)
    {
        _regionManager = regionManager;
        _serviceLocator = serviceLocator;
    }

    public void Initialize() { }
}

此代码与Module2.

初始化模块“Module2.ModuleInit”时发生异常。- 异常消息是:组成保持不变。由于以下错误,更改被拒绝: 合成产生了单个合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。

1) 找到多个与约束匹配的导出 '((exportDefinition.ContractName == "Common.FooService") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "Common.FooService".Equals(exportDefinition.Metadata .get_Item("ExportTypeIdentity"))))'。

导致:无法在部件 'Module1.ModuleInit' 上设置导入 'Module1.ModuleInit._service (ContractName="Common.FooService")'。元素:Module1.ModuleInit._service (ContractName="Common.FooService") --> Module1.ModuleInit --> AssemblyCatalog (Assembly="Module1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

为什么我会收到此异常?我只是导出一个对象。我想知道发生了什么以及如何解决它。

请随意下载它,这是一个非常小的项目。 下载压缩项目

4

2 回答 2

0

这应该只是一个评论,但我还没有足够的代表来做这件事。无论如何,在我看来,这像是一个范围界定问题。我相信 MEF v1 应该自动将导出视为单例,但我认为它在 v2 中被颠倒了 - 不确定您使用的是哪个版本。我最近在使用 Microsoft.Composition(用于 MVC 的 MEF)时遇到了一个问题,并通过使用 HTTP 请求级别范围来获取整个请求生命周期的单个实例来解决它。

[System.Composition.Export(typeof(ICustomDbContext))]
[System.Composition.Shared(Boundaries.HttpRequest)]
public class CustomDbContext : ICustomDbContext { ... }
于 2012-08-16T20:58:09.940 回答
0

解决办法:你把除了Shell Project之外的每个项目都翻一遍,看看引用;请执行下列操作:

  • 只需删除 unityextension 引用,因为您使用的是 MEF
  • 将“通用”引用属性“复制本地”设置为 False
  • 将“Microsoft.Practices.Prism”引用属性“复制本地”设置为 False
  • 将“Microsoft.Practices.Prism.MefExtensions”引用属性“复制本地”设置为 False
  • 将“Microsoft.Practices.Prism.ServiceLocation”引用属性“复制本地”设置为 False
  • 将“System.ComponentModel.Composition”引用属性“复制本地”设置为 False

转到 Bootstrapper 类,添加以下内容:

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

            // Add this assembly to the catalog.
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));

            // Add the FooService assembly
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(FooService).Assembly));
        }

然后取消注释模块中的 [Import(AllowRecomposition)] 和 FooService。

在运行项目之前,您需要转到 Visual Studio 菜单,选择 Build -> Clean Project。这将删除之前复制本地的所有 dll 文件。

于 2012-09-06T00:47:42.597 回答