Prism应用程序中的奇怪异常

时间:2014-03-04 10:56:42

标签: c# wpf prism prism-4

我正在尝试启动一个Prism应用程序,并且出现了一个非常奇怪的错误:

  

InvalidOperationException:必须设置ServiceLocationProvider。

我在main(模块主机)应用程序中使用MainWindow作为单个主shell的区域,它具有自己的区域。这样我可以根据需要换出主窗口布局。

我在InitializeComponent();调用中得到了错误,这是MainWindow构造函数中唯一的代码行。 Google和Bing都会为该确切的短语返回零结果。

MainWindow中的XAML元素是:

<ContentControl regions:RegionManager.RegionName="MainShellRegion" />

我是否必须在MainWindow上实现某些界面或其他内容才能解决此问题?我完全被难倒了。

2 个答案:

答案 0 :(得分:2)

您需要为Prism应用程序设置依赖注入,否则将无法运行。这应该在bootstrapper方法内的ConfigureServiceLocator内完成。

为了扩展上面的内容,Prism是有线的,这样每当它需要访问应用程序组件时,它就不会直接初始化组件(它如何知道使用哪个实现以及如何初始化它?)而是它将此职位委派给service locator

服务定位器是一个组件,其职责是完成对另一个组件的请求,允许两个组件分离。作为开发人员,您有责任实例化和配置服务定位器并将其提供给Prism;这是在应用程序启动期间完成的(因此在引导程序内)。

答案 1 :(得分:1)

Jon写道,Prism需要设置ServiceLocator。这是在引导程序中完成的,应该在抽象的ConfigureServiceLocator方法中完成。 MefBootstrapperUnityBootstrapper具有该方法的实现,其中服务定位器基于组合容器(其本身在ConfigureContainer中设置)来设置。

这些方法(以及更多)都是作为引导程序上Run方法的一部分调用的。

所以我的猜测是你没有正确地调用引导程序。你的代码应该是这样的:

public class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        var bootstrapper = new MyBootstrapper();
        bootstrapper.Run();
    }
}

其他所有内容都应该在bootstrapper上的相应方法中完成。