繁体   English   中英

MEF成分问题

[英]MEF composition issue

我无法解决看似基本的 MEF 问题:我有 2 个“插件”项目(我们将其称为 P1 和 P2),以及两个插件共有的第三个项目(我们将其称为 C) . P1 和 P2 都参考 C。

当尝试导入位于 P1 中的组件时,它会失败,因为该组件依赖于位于 C 中的组件。

这是跟踪:

System.ComponentModel.Composition 警告:1:ComposablePartDefinition 'MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel'已被拒绝。 组成保持不变。 由于以下错误,更改被拒绝: 组合产生了多个组合错误,有 4 个根本原因。 下面提供了根本原因。 查看 CompositionException.Errors 属性以获取更多详细信息。

1)没有找到与约束匹配的导出'((exportDefinition.ContractName = "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel") && (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") && "MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))'。

结果:无法在部分 'MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel (ContractName="MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel")'上设置导入.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel'。 元素:MyCompany.Client.Pms.Plugin.InclusionList.ViewModel.InclusionListViewModel.CalypsoBookSelectorViewModel (ContractName="MyCompany.Client.Plugins.Common.Controls.Selectors.PortfolioSelectors.ViewModel.ICalypsoBookSelectorViewModel") --> MyCompany.Client.Pms.Plugin .InclusionList.ViewModel.InclusionListViewModel --> DirectoryCatalog (Path="C:\\Work\\mmtrader\\dashboard\\Code\\Src\\Dashboard\\MM\\Trader\\bin\\Debug\\Plugins\\Positions")

[...](其他 3 个问题完全相同,在不同的视图模型上)

我查看了MEF目录,结果MEF知道那些视图模型,所以我不知道缺少什么。

根据丹尼斯的要求,以下是我的导入/导出:

出口:

Export(typeof(ICalypsoBookSelectorViewModel))]
public class CalypsoBookSelectorViewModel : ScreenWithCleanupLifecycle, ICalypsoBookSelectorViewModel
{...}

进口:

[Import(typeof(ICalypsoBookSelectorViewModel))]
public ICalypsoBookSelectorViewModel CalypsoBookSelectorViewModel { get; set; }

和目录:

目录

在此先感谢您的帮助!

我终于找到了问题所在,它与 MEF 指向的 CalypsoBookSelectorViewModel 无关。

实际上,ViewModel 依赖于另一个组件(CalypsoBookSelectorModel),而后者又依赖于 IDispatcher 组件。

问题是,这IDispatcher组件,这与合同规定的名称(见下文),中(每个插件一次)TWICE出口,所以MEF分不清楚哪一个使用。 真正的问题当然是MEF 应该告诉我,而不是将手指指向链上两级的类。

感谢丹尼斯查看问题,我希望这会帮助其他遇到同样问题的人。

调度程序导入:

[Import(DispatcherNames.BackgroundDispatcherName, typeof(IDispatcher))]
public IDispatcher Dispatcher { get; set; }

您的P1C导入了一些东西(更准确地说,是ICalypsoBookSelectorViewModel )。

当 MEF 容器尝试创建P1 ,它还会尝试解析P1依赖的所有导入。 因此,它会在自己的目录和父导出提供程序中搜索ICalypsoBookSelectorViewModel类型(实际上是合同名称,但在这种情况下无关紧要)的导出。

如果未找到此类导出(这是您的情况),则 MEF 容器的组成保持不变。
要解决此问题,您应该将[Export(typeof(ICalypsoBookSelectorViewModel))]到相应的类型定义中。

当然,所有这些都意味着您的目录和导出提供程序(如果有)已正确初始化。

请注意,此导出定义相等:

public interface IA {}

[Export(typeof(IA))] // contract name is "IA"
public class A : IA {}

[Export] // contract name is "A"
public class A : IA {}

[Export]
public class Composed
{
    [Import] // MEF will search for exports like [Export(typeof(IA))]
    private IA field1;

    [Import] // MEF will search for exports like [Export]
    private A field1;
}

发生错误是因为他使用[Import] ,对于多个[Import] ,您应该使用[ImportMany]

进入这个问题后,我一直在寻找解决方案。 我意识到我正在使用System.Composition而不是在导出类上使用System.ComponentModel.Composition

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM