Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找在调用ComposeParts后创建的对象的导出_C#_.net_Mef - Fatal编程技术网

C# 查找在调用ComposeParts后创建的对象的导出

C# 查找在调用ComposeParts后创建的对象的导出,c#,.net,mef,C#,.net,Mef,我有一个非常简单的应用程序,一个单一的导出和多个相同类型的导入 调用ComposeParts后,我可以看到导入在我调用ComposeParts的同一个类中工作——MyService属性已经连接好了 问题是,我有另一个UserControl需要访问MyService,但属性没有设置-它在同一个包中,等等。但在我调用ComposeParts时它没有安装 如果我将CompositionContainer设置为public/static并调用ComposeParts并传递UserControl,则会设置

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

调用ComposeParts后,我可以看到导入在我调用ComposeParts的同一个类中工作——MyService属性已经连接好了

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

如果我将CompositionContainer设置为public/static并调用ComposeParts并传递UserControl,则会设置MyService属性,但这是一个糟糕的解决方案

有人能解释一下发生了什么事吗?ComposeParts是否只有足够智能才能连接现有对象,或者导入属性是否能够在以后处理对象?我把什么东西挂错了吗

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; }
}
更新: 我正在尝试将一个25万行的C#prject从.NET2.0中的服务提供商模型升级到MEF

您似乎无法仅通过Import属性将新对象实例自动连接到它所需的服务。看起来你需要重新触发ComposeParts之类的东西。瘸子


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

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

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


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

您可以在Codeplex上查看框架以获取动态挂钩


链接:

如果您注册了一个帐户,您将能够编辑自己的帖子。好吧,您的容器将是静态的,因为您肯定不希望容器的单独实例分散在您的代码中。你只需要一个。如果您使用的是DI,而不是使其成为静态的,那么您可以向DI注册它。(但您的DI容器本身将是静态的。您能看到模式吗?=))这可能是相关的