我有一个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。你知道我错过了什么吗?
发布于 2011-02-08 15:48:05
在运行构造函数时,将永远不会设置属性导入,因为在构造对象之前不能设置它的属性。
另一个问题是,在InfModule中,设置导出值为时已晚。MEF只查看一次导出的值,然后缓存值,不再调用getter。在本例中,它是在调用Initialize()之前获得导出的。设置导出的逻辑需要从构造函数或属性getter中的代码运行。
https://stackoverflow.com/questions/4934198
复制相似问题