加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – MEF 2中的“缺失依赖”异常

发布时间:2020-12-13 20:47:24 所属栏目:百科 来源:网络整理
导读:我正在研究MEF 2.下面的代码抛出异常: An unhandled exception of type ‘System.Composition.Hosting.CompositionFailedException’ occurred in System.Composition.TypedParts.dll Additional information: Missing dependency ‘MessageSenders’ on ‘
我正在研究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上的便携式可用

列表< 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来源显示了原因.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读