繁体   English   中英

MEF成分问题

MEF composition issue

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我无法解决看似基本的 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; }

和目录:

目录

在此先感谢您的帮助!

4 个回复

我终于找到了问题所在,它与 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

1 MEF成分导入问题

我有一个MEF构成问题。 在开发环境中,我可以使用此代码导入零件。 但是,当我部署到无法正常工作的测试服务器时。 我发现使其正常工作的唯一方法是显式加载具有如下所示导出功能的dll: 显然,我并不是真的要显式加载每个具有导出功能的dll。 那种失败了MEF的目的。 但是, ...

2011-12-07 20:48:44 1 298   mef
2 如何在成分后改变MEF中的部分成分?

我已经将我的应用程序设置为具有可发现的安全服务( ISecurityService ),该服务具有单个方法IPrincipal GetPrincipal() 。 实施者可以自由决定如何获得委托人(通过域名登录,数据库等)。 所以我的应用程序然后有部分在启动时根据用户所处的角色做事情,例如我导 ...

3 MEF依赖问题

简单的例子。 应用程序A有一个类库C,该类库C一直使用完。 应用程序A使用MEF从插件目录中发现并加载插件P1和P2。 每个插件一个组件。 P1和P2都依赖于C(类库)。 生成过程将确保P1使用的C版本与A引用的版本相同。 我以为我不会一次加载同一程序集的多个副本 ...

2012-08-30 10:40:11 1 121   mef
4 关于MEF战略和结构的问题

我的任务是模块化一个C#应用程序,它是一个非常大的Delphi应用程序的重写(数据库有249个表!)。 业务限制禁止对.NET进行全面的重新设计以及更好的整体架构,因此我们基本上只是在C#中逐步重写Delphi应用程序模块的模块。 在完成之前,该套件将包含待处理重写的混合,以及我想使用MEF ...

5 MEF + SL4问题

我正在使用Silverlight 4 RC中的应用程序,我正在考虑学习MEF来处理插件控件。 我已经让它在一个非常基本的庄园工作,但它不是很整洁,我知道有更好的方法导入多个xap。 基本上,在我的主机应用程序的App.xaml中,我有以下告诉MEF加载我的xap: 我确定我没有在 ...

6 导入的MEF问题

我在将shell-view-model导入到view-model类时遇到问题,我使用MEF。 Shell-view-model: 我需要在视图模型类中导入此类: 问题是初始化后变量_shellViewModel为空。 我的引导程序看起来像这样: 我的解决方案: ...

2010-12-14 15:08:46 0 320   wpf/ mef
7 MEF的对象销毁问题

我使用静态变量保存对象数。 在构造函数中,我增加了这个变量。 这样,我知道创建了多少个对象实例。 使用对象后,将其取消引用。 我怀疑MEF是否持有对这些对象的引用,因此我强制GC进行清理(使用GC.Collect()方法)。 我期望在下一个对象创建时,该变量从零开始,但从最后一个数字开 ...

8 我的 MEF 出口有什么问题吗?

我收到一个错误: 我的 MenuView 使用 MEF 通过 MenuViewModel 设置其数据上下文,MEF 又导入了 IServiceFactory 的一个实例。 我确信错误是由于 IServiceFactory 和 MEF 而发生的。 ....... 我的意思是出口或进口。 我猜这是 ...

9 MEF导入组合问题

我已经阅读了关于在不导出包含类的情况下编写导入问题的所有问题,但我无法找到解决问题的方法。 有没有人知道如何实现我想要做的事情? 我的模块程序集具有内部使用的表单和类。 这些表单需要访问某些导出的合同,但导入不会加载,因为它们不在MEF的组合树中 主机组装: 模块组装: ...

10 MEF导入问题

我在使用MEF将视图模型类中的接口导入类时遇到问题。 我查看创建属性的模型: 我想在视图模型的构造函数中订阅此事件聚合器: 所以我尝试这样: 我运行应用程序但应用程序冻结。 因此,我尝试在OnImportsSatisfied方法中订阅事件聚合器: 但是, ...

暂无
暂无

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

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