【问题标题】:Locating Exports for Objects Created After ComposeParts Called查找调用 ComposeParts 后创建的对象的导出
【发布时间】:2011-04-25 17:53:27
【问题描述】:

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

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

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

如果我将我的 CompositionContainer 设为 public/static 并调用 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; }
}

更新:

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

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

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

【问题讨论】:

  • 如果您注册了一个帐户,您将能够编辑自己的帖子。
  • 好吧,你的容器无论如何都会是静态的,因为你肯定不希望容器的单独实例分散在你的代码中。你只需要一个。如果您使用的是 DI,而不是将其设为静态,您可以将其注册到您的 DI。 (但是你的 DI 容器本身无论如何都是静态的。你能看到模式吗?=))
  • 这个stackoverflow.com/questions/2655209/…可能是相关的

标签: c# .net mef


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以查看 Codeplex 上的 dI.Hook 框架以了解动态挂钩

    链接:http://dihook.codeplex.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多