我的目标是在应用程序的其余部分(可见UI)之前加载我的一个数据服务。
在尝试预加载我的数据服务之前,我的MVVMlight设置非常好。
在我的App.xaml.cs中,主视图像这样加载。
var mainWindow = new View.MainWindow();
mainWindow.Show();
要预加载我的数据服务,我将我的数据服务设置为createInstanceImlyly,然后在mainWindow代码上方添加以下内容。
DataService dataService = SimpleIoc.Default.GetInstance<IDataService>();
该行生成异常“CommonServiceLocator.ActivationException:'在缓存中找不到类型:Namespace.IDataService。'”
如果将该行向下移动到mainWindow代码下方,它就可以正常工作。
我的第一个想法是这是一个时间问题,但如果我添加延迟,我仍然会得到错误。因此,似乎在加载视图之后才加载应用程序资源。我不会想到这一点,因为app.xaml和app.xaml.cs实际上是同一个类的一部分。无论如何,我不知道如何解决这个问题,或者我是否可以。
为什么ViewModelLocator在没有视图的情况下加载?有没有办法强制它手动加载应用程序资源?或者,还有更好的方法?
我终于找到了解决方案。
诀窍是从应用程序资源手动实例化ViewModelLocator
。
private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator
然后,如果需要,可以通过viewModelLocator.Main
(或您指定的任何属性名称)访问视图模型。
放置这个位很重要。它不能从App构造函数中运行,但它可以从Application_Startup事件处理程序中运行。我最终放入了自己从Application_Startup加载的类,更多的是保持我的App.xaml.cs干净。
使用一段时间后,我越来越喜欢它,可能会更频繁地开始使用。当我的需求不需要信使服务时,它可以很容易地在视图模型之间连接我的事件。