MEF组成问题

Ant*_*oin 8 c# mef composition

我无法解决看似基本的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’)"关于部分"MyCompany的.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:\工作\ mmtrader \仪表板\代码\ SRC \仪表板\ MM \操盘\ BIN \调试\插件\位置")

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

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

根据Dennis的要求,以下是我的导入/导出:

出口:

Export(typeof(ICalypsoBookSelectorViewModel))]
public class CalypsoBookSelectorViewModel : ScreenWithCleanupLifecycle, ICalypsoBookSelectorViewModel
{...}
Run Code Online (Sandbox Code Playgroud)

进口:

[Import(typeof(ICalypsoBookSelectorViewModel))]
public ICalypsoBookSelectorViewModel CalypsoBookSelectorViewModel { get; set; }
Run Code Online (Sandbox Code Playgroud)

目录:

目录

在此先感谢您的帮助!

Ant*_*oin 9

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

实际上,ViewModel依赖于另一个组件(CalypsoBookSelectorModel),而该组件又依赖于IDispatcher组件.

问题是这个IDispatcher组件,用合同名称(见下文)指定,导出TWICE(每个插件一次),因此MEF无法分辨使用哪一个.真正的问题当然是MEF应该告诉我,而不是将手指指向一个两级以上的级别.

感谢Dennis查看问题,我希望这会帮助那些会遇到同样问题的人.

Dispatcher导入:

[Import(DispatcherNames.BackgroundDispatcherName, typeof(IDispatcher))]
public IDispatcher Dispatcher { get; set; }
Run Code Online (Sandbox Code Playgroud)


Den*_*nis 6

P1输入的东西C(更确切地说,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;
}
Run Code Online (Sandbox Code Playgroud)