gpt4 book ai didi

.net - "Missing dependency"MEF 2 异常

转载 作者:行者123 更新时间:2023-12-04 12:40:57 24 4
gpt4 key购买 nike

我正在学习 MEF 2。下面的代码抛出以下异常:

An unhandled exception of type 'System.Composition.Hosting.CompositionFailedException' occurred in System.Composition.TypedParts.dll

Additional information: Missing dependency 'MessageSenders' on 'MEFStudy.Program'.



调用 SatisfyImports() 方法时。为什么?
using System;
using System.Collections.Generic;
using System.Composition;
using System.Composition.Hosting;


using System.Reflection;

namespace MEFStudy
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}

[ImportMany]
private List<IMessageSender> MessageSenders { get; set; }

public void Run()
{
Compose();
foreach (IMessageSender sender in MessageSenders)
{
sender.Send();
}

}

private void Compose()
{
CompositionHost host = new ContainerConfiguration().WithAssembly(Assembly.GetExecutingAssembly()).CreateContainer();
host.SatisfyImports(this); // <=========== HERE
host.Dispose();

}
}

public interface IMessageSender
{
void Send();
}

[Export(typeof(IMessageSender))]
public class EmailSender1 : IMessageSender
{
public void Send()
{
Console.WriteLine("EmailSender1");
}
}

[Export(typeof(IMessageSender))]
public class EmailSender2 : IMessageSender
{
public void Send()
{
Console.WriteLine("EmailSender2");
}
}

}

更新 1

根据 here ,有 2 个版本的 MEF。
  • .NET Framework 附带的非可移植
  • NuGet 上提供的可移植设备
  • List<IMessageSender>方法适用于非可移植。但不是可移植的。这是一个错误吗?

    最佳答案

    我不小心更改了以下代码:

    [ImportMany]
    private List<IMessageSender> MessageSenders { get; set; }


    [ImportMany]
    private IEnumerable<IMessageSender> MessageSenders { get; set; }

    它解决了这个问题。

    但是,为什么?不是 List<T> IEnumerable<T> ?

    添加

    更奇怪的是,我将 IEnumerable 更改为 IList,它有效。为什么?

    可能的解释

    (我想分享我对此的解释。)

    以下界面可以重现完全相同的错误。
    interface IMyList<T> : IList<T>
    {

    }

    [System.Composition.ImportMany] // MEF 2
    private IMyList<IMessageSender> MessageSenders { get; set; }

    以下 MEF 2 来源显示了原因。

    enter image description here

    3 个 SupportedContactTypes 的 Equals() 方法使用 IMyList<> 返回 false。所以在 MEF2 中不会返回 IMyList<> 的有效导出。
    并且 MEF 2 不允许为使用 [ImportMany] 属性修饰的属性设置默认值。所以在下面的逻辑中,会抛出依赖缺失异常。

    enter image description here

    所以我们可以说,ImportMany 属性只支持数组和 3 种支持的泛型类型。

    关于.net - "Missing dependency"MEF 2 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660013/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com