【发布时间】: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 容器本身无论如何都是静态的。你能看到模式吗?=))