Prism v4,MEF服务

时间:2011-02-08 14:23:38

标签: wpf service prism mef

我有一个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。任何想法都是我错过的?

1 个答案:

答案 0 :(得分:2)

运行构造函数时永远不会设置属性导入,因为在构造对象之前无法设置对象的属性。

另一个问题是,在InfModule中,您设置的导出值太晚了。 MEF只查看一次导出的值,然后缓存该值并且不再调用getter。在这种情况下,它在调用Initialize()之前获取导出。设置导出的逻辑需要从构造函数或属性getter中的代码运行。