.net – MEF 2中的“缺失依赖”异常
我正在研究MEF 2.下面的代码抛出异常:
调用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进行非便携式操作 列表< 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<>的有效导出. 所以我们可以说,ImportMany属性只支持数组和3种支持的泛型类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |