Prism 7.1:IContainerProvider 和 IContainerRegistry

Prism 7.1 : IContainerProvider & IContainerRegistry

这里是新开发人员,正在开发我的第二个应用程序,第一个使用 Prism 7.1。

我希望在正确访问 Shell.xaml.cs 中注册的 ViewModel 方面得到一些帮助。

这是我正在使用的内容:

App.xaml.cs

public partial class App
{
  protected override Window CreateShell()
  {
    return Container.Resolve<Shell>();
  }
  protected override void RegisterTypes(IContanerRegistry containerRegistry)
  {
    containerRegistry.Register<ShellViewModel>();
  }
}

Shell.xaml.cs

public partial class Shell : MetroWindow
{
    public Shell()
    {
        InitializeComponent();
    }
 }

通过执行以下操作,我能够很好地访问我的 ViewModel 的属性:

var shellVM_Instance = containerProvider.Resolve<ShellViewModel>();
shellVM_Instance.IsBusy = false;

代码可以编译,但不会 运行。当我 运行 代码时,它告诉我来自上述 var shellVM_Instance 的 ShellViewModel 正在引用 ShellViewModel 类型的空对象。这让我认为我没有用 IContainerRegistry 正确注册 ViewModel。

谁能提供帮助?

我想避免使用 Bootstrapper class,并利用 Prism 7.1 提供的功能 (Brian's Release Notes)

我感谢这里的任何指导,感谢您在我尝试围绕 Prism 及其真正潜力展开思考时的耐心等待。

编辑:

我看到 IContainerRegistry 有一个 RegisterInstance 方法..

void RegisterInstance(Type type, object instance);

我一辈子都搞不懂语法。我的尝试:

protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        ShellViewModel shell_VM = new ShellViewModel();
        containerRegistry.RegisterInstance<ShellViewModel, shell_VM>();
    }

谢谢!

-克里斯

IContainerRegistry and IContainerRegistryExtensions.

所以你可以做任何一个

containerRegistry.RegisterInstance( typeof( ShellViewModel ), shell_VM );

或一般使用扩展方法

containerRegistry.RegisterInstance<ShellViewModel>( shell_VM );

最好注册为单例,以防万一你有任何依赖关系(否则你必须自己解决)

containerRegistry.RegisterSingleton<ShellViewModel>();

话虽如此,您从一开始就做错了。极少数情况下,视图模型是单例。相反,让您的视图模型通过第三方单例(EventAggregator 或您自己的服务之一)进行通信。对于你的情况,我建议这样:

public interface IApplicationBusyIndicator : INotifyPropertyChanged
{
    bool IsBusy { get; set; }
}

然后让 shell 视图模型监视对 IsBusy 的更改并激活或停用您的 wait-overlay,而其他视图模型或服务在它们“正在做事。当然,如果您碰巧有不止一个参与者使应用程序繁忙并且这些操作重叠,您可以使其更复杂...

public interface IApplicationBusySetter
{
    IDisposable RequestBusy();
}

然后显示 wait-screen 直到处理完所有请求。