gpt4 book ai didi

c# - 定位调用 ComposeParts 后创建的对象的导出

转载 作者:行者123 更新时间:2023-11-30 12:51:55 25 4
gpt4 key购买 nike

我有一个非常简单的应用程序,具有针对同一类型的一次导出和多次导入。

在我调用 ComposeParts 之后,我可以看到导入在我从中调用 ComposeParts 的同一个类中工作 - MyService 属性已连接。

问题是我有另一个 UserControl 需要访问 MyService 并且属性未设置 - 它在同一个包等中,但在我调用 ComposeParts 时它没有实例化。

如果我将 CompositionContainer 设为公共(public)/静态并调用 ComposeParts 并传递 UserControl,则设置 MyService 属性,但这是一个糟糕的解决方案。

任何人都可以阐明正在发生的事情吗? ComposeParts 是否仅足够智能以连接现有对象,或者 Import 属性是否能够在以后对对象起作用?我是不是连接错了什么?

public partial class App : Application    
{

protected override void OnActivated(EventArgs e)
{
AssemblyCatalog assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
compositionContainer = new CompositionContainer(assemblyCatalog);
compositionContainer.ComposeParts(this);
}

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

更新:

我正在尝试将一个 250k 行的 C# 项目从 .Net 2.0 中的服务提供商模型升级到 MEF。

您似乎无法仅通过 Import 属性将新的对象实例自动连接到它所需的服务。似乎您需要重新触发 ComposeParts 或类似的东西。蹩脚的。

在 .Net 2.0 提供者/容器模型中,您需要显式地将子对象添加到父容器,查找服务将是从子容器到父容器的递归检查。我不确定 MEF 中的推论是什么??

最佳答案

有一件事看起来像是一个问题,那就是您的目录中只有一个程序集(正在执行的程序集)。如果这是一个单一程序集项目,其中所有 [Export] 项目都在同一个程序集中,那么它将正常工作。如果没有,则需要将所有程序集传递到目录中或使用 DirectoryCatalog

您可以使用 [Export] 标记 UserControl 类,然后您可以使用 CompositionContainer.GetExportedValue() 而不是调用它们的构造函数创建 UserControl 并一次性完成其所有 [Import] 需求。但是,如果窗体在设计时就已经有了控件,那么这对于 UI 并不总是可行的。在这种情况下,您必须调用 ComposeParts 来设置 [Import] 值。

这实际上归结为您如何在应用程序中设置 UserControl 类。如果您在运行时连接它,那么您就有机会连接到 CompositionContainer 来为您创建实例并自动连接它们。如果您依靠设计时代码来设置控件,则需要将所有 GetService() 调用替换为 ComposeParts() 调用。

关于c# - 定位调用 ComposeParts 后创建的对象的导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5781328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com