Ahe*_*Ahe 3 dependency-injection mef inversion-of-control
我只是在我的mef应用程序中找到了一个问题; 问题是,我有一个[Import]而不是[ImportMany]在我的IEnumerable<IFoo>财产.我开始想知道为什么.MEF看到注射目标是"集合"并且可以确定需要集合而不是单个元素.至少Ninject是这样工作的.
有谁有洞察力为什么[ImportMany]需要?我能想到的唯一原因是人们可能想要,[Export(typeof(IEnumerable<IBar>)] public IEnumerable<Bar> { get; }但这真的是这个设计的原因吗?我敢打赌,我不是唯一一个调试过这种错误的人.
这是不一样的 ;)
[Import]表示您要根据合同导入单个内容.在MEF中,契约只是一个字符串,当你导入一个类型(如IEnumerable<IBar>)时,你实际上是根据一个只是该类型名称的契约进行导入.
在MEF,基数是非常重要的,所以当你的国家,你要导入一个单一的东西实例符合合同规定,只能有一个单一的来源.如果找到多个导出,则由于基数不匹配而抛出异常.
该[Import]功能不包含要处理的特殊逻辑IEnumerable<T>,因此从它的角度来看,它只是一个像其他一切一样的契约.
[ImportMany]但是,该属性尤其适用于弥合这一差距.它对所述合同的任何数量的出口都接受零.这意味着您可以将多个导出分散在多个程序集中,而不是单个导出,而且永远不会出现基数不匹配.IEnumerable<IBar>IBar
最后,它是一个设计哲学.MEF可能有特殊的,内置的知识IEnumerable<T>.Autofac(显然是Ninject)这样做并将其称为关系类型.
然而,像这样的特殊情况意味着某个地方的实施代码违反了Liskov替代原则,这又会导致违反POLA,所以在这种情况下,我倾向于与MEF设计师站在一边.寻求更明确的API可能会降低可发现性,但可能会更安全一些.
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |