我正在尝试启动一个Prism应用程序,并且出现了一个非常奇怪的错误:
InvalidOperationException:必须设置ServiceLocationProvider。
我在main(模块主机)应用程序中使用MainWindow
作为单个主shell的区域,它具有自己的区域。这样我可以根据需要换出主窗口布局。
我在InitializeComponent();
调用中得到了错误,这是MainWindow
构造函数中唯一的代码行。 Google和Bing都会为该确切的短语返回零结果。
MainWindow
中的XAML元素是:
<ContentControl regions:RegionManager.RegionName="MainShellRegion" />
我是否必须在MainWindow
上实现某些界面或其他内容才能解决此问题?我完全被难倒了。
答案 0 :(得分:2)
您需要为Prism应用程序设置依赖注入,否则将无法运行。这应该在bootstrapper方法内的ConfigureServiceLocator
内完成。
为了扩展上面的内容,Prism是有线的,这样每当它需要访问应用程序组件时,它就不会直接初始化组件(它如何知道使用哪个实现以及如何初始化它?)而是它将此职位委派给service locator。
服务定位器是一个组件,其职责是完成对另一个组件的请求,允许两个组件分离。作为开发人员,您有责任实例化和配置服务定位器并将其提供给Prism;这是在应用程序启动期间完成的(因此在引导程序内)。
答案 1 :(得分:1)
Jon写道,Prism需要设置ServiceLocator。这是在引导程序中完成的,应该在抽象的ConfigureServiceLocator
方法中完成。 MefBootstrapper
或UnityBootstrapper
具有该方法的实现,其中服务定位器基于组合容器(其本身在ConfigureContainer
中设置)来设置。
这些方法(以及更多)都是作为引导程序上Run
方法的一部分调用的。
所以我的猜测是你没有正确地调用引导程序。你的代码应该是这样的:
public class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
var bootstrapper = new MyBootstrapper();
bootstrapper.Run();
}
}
其他所有内容都应该在bootstrapper上的相应方法中完成。