我有一个WPF窗口应用程序,它使用菜单的ms功能区控件。在我的基础架构项目中,我想要一个将在所有模块中引用的共享服务。然后,每个模块将使用该服务来定义应为模块显示的菜单项。
我读了这个Prism+MEF: delayed a service export from prism-module,但无法让我的其他模块识别该服务。
服务
namespace Infrastructure
{
[ModuleExport("InfModule", typeof(InfModule), InitializationMode = InitializationMode.WhenAvailable)]
[PartCreationPolicy(CreationPolicy.Shared)]
public class InfModule : IModule
{
[Export(typeof(IMenuService))]
public IMenuService MenuService { get; private set; }
public void Initialize()
{
MenuService = new MenuService();
MenuService.AddItem("test");
}
}
}
模块
namespace Classic
{
[ModuleExport("Classic", typeof(Classic), InitializationMode = InitializationMode.WhenAvailable)]
[ModuleDependency("InfModule")]
public class Classic : IModule
{
private IRegionManager _regionManager;
[Import(typeof(IMenuService))]
private IMenuService menuService { get; set; }
[ImportingConstructor]
public Classic(IRegionManager regionManager)
{
this._regionManager = regionManager;
// This shows as true
Debug.WriteLine(menuService == null);
}
public void Initialize()
{
_regionManager.RegisterViewWithRegion("RibbonRegion", typeof(Views.RibbonTabMenu));
// This shows as true
Debug.WriteLine(menuService == null);
}
}
}
我原本期望其中一个调试行在导入后输出为false。任何想法都是我错过的?
答案 0 :(得分:2)
运行构造函数时永远不会设置属性导入,因为在构造对象之前无法设置对象的属性。
另一个问题是,在InfModule中,您设置的导出值太晚了。 MEF只查看一次导出的值,然后缓存该值并且不再调用getter。在这种情况下,它在调用Initialize()之前获取导出。设置导出的逻辑需要从构造函数或属性getter中的代码运行。