【问题标题】:Instantiating multiple instances of PRISM shell实例化 PRISM shell 的多个实例
【发布时间】:2016-01-05 18:41:03
【问题描述】:

我正在尝试设置一个允许打开同一窗口(shell)的多个实例的应用程序。我有一个主 shell(由 Bootstrapper 设置),我从中打开第二个 shell 的新实例。第二个 shell 包含几个区域。

现在有一个问题,因为给定区域每个应用程序(或 RegionManager)只能出现一次,所以我尝试为每个 shell 赋予自己的 RegionManager。这似乎工作正常,但是我也使用 Unity 将 RegionManager 注入到我的 ViewModels/Controllers 中,这意味着我总是获取主 shell 的实例,而不是绑定到 ViewModel 所属的 shell 的实例。

是否有可能使这项工作发挥作用?这甚至是我的用例的正确方法吗?

【问题讨论】:

    标签: c# unity-container prism


    【解决方案1】:

    您可以使用作用域区域和自定义对话服务来解决此问题。

    我真的建议在 Prism Problems & Solutions: Showing Multiple Shells 上查看 Brian Lagunas 的 PluralSight 课程,了解一些很好的深入细节,这也是该解决方案的来源。

    为了让您开始考虑以下服务:

    public interface IShellService
    {
        void ShowShell();
    }
    
    public class ShellService : IShellService
    {
        private IUnityContainer _unityContainer;
        private IRegionManager _regionManager;
    
        public ShellService(IUnityContainer unityContainer, IRegionManager regionManager)
        {
            _unityContainer = unityContainer;
            _regionManager = _regionManager;
    
        }
    
        public void ShowShell()
        {
            shell = _container.Resolve<Shell>();
    
            var scopedRegion = _regionManager.CreateRegionManager();
    
            RegionManager.SetRegionManager(shell, scopedRegion);
    
            shell.Show();
        }
    }
    

    假设您使用的是 Unity,那么您需要使用 ContainerControlledLifeTimeManager 注册 IShellService,这将告诉您的容器保留发送给它的实例(本质上使其成为单例)。

    Container.RegisterType<IShellService, ShellService>(new ContainerControlledLifeTimeManager());
    

    然后,您只需在需要打开新 shell 的任何位置注入 IShellService,并在其上调用 ShowShell()

    private void ExecuteShowShellCommand()
    {
        _shellService.ShowShell();
    }
    

    【讨论】:

    • 优秀的答案。你拯救了我的一天
    【解决方案2】:

    有几种方法可以解决这个问题。可能最简单的方法是使用 Scoped RegionManager: https://msdn.microsoft.com/en-us/library/ff921162.aspx http://southworks.com/blog/2011/11/30/prism-region-navigation-and-scoped-regions/

    另一个是您可以将 IRegionManager 的命名实例(每个 shell 窗口一个)注册到容器中,并通过名称解析这些实例。这只有在依赖于这些命名实例的 ViewModel/Service 只能在一个或另一个窗口中创建时才真正有效。

    另一种方法是为每个窗口创建一个子容器,并在每个子容器中注册一个单独的 RegionManager 实例,以便尝试解析窗口内的实例与该窗口的区域管理器冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多