首页 > 解决方案 > Prism 7.0 RegisterSingleton 不工作?

问题描述

我正在使用 Prism 7 和 Unity 5 为我的应用程序开发菜单服务。该应用程序是 WPF、MVVM、模块化的。

主菜单是分配给区域的模块。menuService 跟踪可用的菜单选项并实现菜单对象。menu 模块将 menuService 注册为单例:

public void RegisterTypes(IContainerRegistry containerRegistry) {
     containerRegistry.RegisterSingleton<IMenuService, MainMenuService>();
}

在 OnInitialized 中,它解析 menuService 并注册永久菜单选择。

        IMenuService menu = containerProvider.Resolve<MainMenuService>();
        menu.AddTopLevelMenu(fileMenu);
        menu.AddTopLevelMenu(toolMenu);
        menu.AddTopLevelMenu(helpMenu);

当其他模块被实例化时,我使用 DI 来传递 menuService 实例,以便他们可以添加任何其他菜单选择。一切正常,只是传递给其他模块的 menuService 实例是一个新的,而不是在 MenuModule 中初始化的那个。我尝试过使用构造函数注入和注入方法。它们都产生相同的结果。

我已经验证模块正在以正确的顺序实例化。我浏览了容器注册表,并且 menuService 已注册到 ContainerControlledLifetimeManager。

我无法弄清楚我错过了什么。任何建议表示赞赏。

标签: wpfmvvmmoduleunity-containerprism

解决方案


containerRegistry.RegisterSingleton<IMenuService, MainMenuService>();

注册MainMenuServiceIMenuService.

containerProvider.Resolve<MainMenuService>();

解析MainMenuService. 这与为 IMenuService 注册的实现不同,实际上根本没有注册,当然也没有注册为单例。即使您注册MainMenuService为单例,它也将是与注册为实施的单例不同的单例IMenuService

长话短说 - 解决IMenuService,你很好:

containerProvider.Resolve<IMenuService>();

推荐阅读