如何解决Caliburn.Micro中的循环引用

时间:2014-11-27 09:02:31

标签: c# mvvm windows-8.1 caliburn.micro circular-dependency

我正在 Windows 8.1 Unversal(WinRT)项目中使用 Caliburn.Micro v2.0.1。

我按照Caliburn.Micro Working with WinRT示例。

我的代码如下:

App.xaml.cs

protected override void OnLaunched(LaunchActivatedEventArgs args)
{
    Initialize();
    DisplayRootViewFor<LoginViewModel>();
}

protected override void PrepareViewFirst(Frame rootFrame)
{
    _container.RegisterNavigationService(rootFrame);
}

LoginViewModel.cs

public LoginViewModel(INavigationService navigationService, ...)
{
   ...
}

问题

首先调用OnLaunched

Initialize()配置WinRT容器。

  1. DisplayRootViewFor<LoginViewModel>调用LoginViewModel的实例并导致Null异常,因为PrepareViewFirst(Frame)尚未注册NavigationService
  2. 尚未调用
  3. PrepareViewFirst(Frame),依赖于应RootFrame
  4. 配置的OnLaunched

    因此LoginViewModel取决于RegisterNavigationServiceRegisterNavigationService取决于DisplayRootViewFor<LoginViewModel>(),这取决于LoginViewModel

    有没有办法克服这个循环引用问题?

2 个答案:

答案 0 :(得分:1)

在解析Views之前在容器中注册您的服务 - 这样所有依赖项都可以在特定的依赖注入容器中使用,您可以使用ServiceLocator来查找它们。

通常,我总是使用OnStartup()的{​​{1}}方法完成此操作。

答案 1 :(得分:0)

您应该在应用程序最早的访问点composition root注册/配置容器。

这一点取决于您拥有的应用程序类型:

等。

检查http://msdn.microsoft.com/en-us/magazine/hh148153.aspx enter image description here

上的Windows 7生命周期