我正在 Windows 8.1 Unversal(WinRT)项目中使用 Caliburn.Micro v2.0.1。
我按照Caliburn.Micro Working with WinRT示例。
我的代码如下:
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
Initialize();
DisplayRootViewFor<LoginViewModel>();
}
protected override void PrepareViewFirst(Frame rootFrame)
{
_container.RegisterNavigationService(rootFrame);
}
public LoginViewModel(INavigationService navigationService, ...)
{
...
}
首先调用OnLaunched
。
Initialize()
配置WinRT容器。
DisplayRootViewFor<LoginViewModel>
调用LoginViewModel
的实例并导致Null异常,因为PrepareViewFirst(Frame)
尚未注册NavigationService PrepareViewFirst(Frame)
,依赖于应RootFrame
OnLaunched
醇>
因此LoginViewModel
取决于RegisterNavigationService
而RegisterNavigationService
取决于DisplayRootViewFor<LoginViewModel>()
,这取决于LoginViewModel
有没有办法克服这个循环引用问题?
答案 0 :(得分:1)
在解析Views
之前在容器中注册您的服务 - 这样所有依赖项都可以在特定的依赖注入容器中使用,您可以使用ServiceLocator
来查找它们。
通常,我总是使用OnStartup()
的{{1}}方法完成此操作。
答案 1 :(得分:0)
您应该在应用程序最早的访问点composition root注册/配置容器。
这一点取决于您拥有的应用程序类型:
等。
上的Windows 7生命周期