在我调用ComposeParts后,我可以看到导入工作在我调用ComposeParts的同一个类中–MyService属性已被连接.
问题是我有另一个需要访问MyService的UserControl并且没有设置属性 – 它在同一个包中等但是在我调用ComposeParts时没有实例化.
如果我使我的CompositionContainer公共/静态并调用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; } }
更新:
我正在尝试将.b 2.0中的服务提供商模型的250k行C#项目升级到MEF.
您似乎无法通过Import属性自动将新对象实例连接到它所需的服务.看起来你需要重新触发ComposeParts或类似的东西.瘸.
在.Net 2.0提供程序/容器模型中,您需要将子对象显式添加到父容器,并且查找服务将是从子容器到父容器的递归检查.我不确定MEF的证据是什么?
解决方法@H_502_29@
看起来像问题的一件事是你的目录中只有一个程序集(执行程序集).如果这是一个单组装项目,其中所有[Export]项目都在同一个程序集中,那么它将正常工作.如果没有,那么您需要将所有程序集传递到目录中或使用DirectoryCatalog.
您可以使用[Export]标记UserControl类,然后可以使用CompositionContainer.GetExportedValue()来创建UserControl并一次性满足其所有[Import]需求,而不是调用它们的构造函数.但是,如果表单在设计时已经具有控件,那么对于UI来说这并不总是可行的.在这种情况下,您必须调用ComposeParts来设置[Import]值.
它实际上归结为您如何在应用程序中设置UserControl类.如果您在运行时连接它,那么您有机会挂钩到CompositionContainer为您创建实例并自动连接它们.如果您依靠设计时代码来设置控件,那么您需要使用ComposeParts()调用替换所有GetService()调用.
您可以使用[Export]标记UserControl类,然后可以使用CompositionContainer.GetExportedValue()来创建UserControl并一次性满足其所有[Import]需求,而不是调用它们的构造函数.但是,如果表单在设计时已经具有控件,那么对于UI来说这并不总是可行的.在这种情况下,您必须调用ComposeParts来设置[Import]值.
它实际上归结为您如何在应用程序中设置UserControl类.如果您在运行时连接它,那么您有机会挂钩到CompositionContainer为您创建实例并自动连接它们.如果您依靠设计时代码来设置控件,那么您需要使用ComposeParts()调用替换所有GetService()调用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。