实例化PRISM shell的多个实例

时间:2015-10-08 08:41:33

标签: c# unity-container prism

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

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

以某种方式可以使这项工作成功吗?对于我的用例,这甚至是正确的方法吗?

3 个答案:

答案 0 :(得分:2)

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

我真的建议在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();
}

答案 1 :(得分: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 / Services只能在一个Window或另一个Window中创建时,这才真正有效。

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

答案 2 :(得分:2)

显示多个shell实际上比首次出现的更多。这就是为什么我创建了一个Pluralsight课程,告诉你如何做到这一点,并指出&#34;陷阱&#34;在这个过程中。

http://www.pluralsight.com/courses/prism-showing-multiple-shells