Prism.Autofac.WPF 7无法解析IContainer问题求助
解决Prism.Autofac.WPF 7启动时的DependencyResolutionException与InvalidOperationException问题
我来帮你梳理下问题根源和解决办法——你踩的坑其实是对Prism+Autofac的生命周期流程理解有误,咱们一步步拆解:
问题核心分析
第一个异常(DependencyResolutionException)的原因
Prism.Autofac的初始化流程里,容器是Prism自动负责构建的,它会在RegisterTypes执行完成后,自动完成ContainerBuilder.Build(),并把IContainer实例注册到容器中,供AutofacServiceLocatorAdapter这类内部组件使用。
你遇到的异常,是因为在Prism完成容器构建前,某个环节提前触发了依赖解析(或者你的MainWindow没有被正确注册导致无法解析),但更关键的是你后续的修改完全打乱了Prism的流程。
第二个异常(InvalidOperationException)的原因
你手动调用builder.Build()是完全错误的——ContainerBuilder本身就只能被Build一次,而Prism内部会在RegisterTypes执行结束后自动执行Build操作,你提前Build会导致Prism后续执行Build时触发冲突。
正确的极简实现方案
你只需要移除手动构建容器的代码,让Prism按自己的流程走即可,以下是完整的正确代码:
App.xaml.cs
using Prism.Autofac; using Prism.Ioc; using System.Windows; namespace MyNamespace { public partial class App : PrismApplication { protected override Window CreateShell() { // 现在这个方法能正常执行了,前提是MainWindow能被正确解析 return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 在这里注册你的业务服务、View等,绝对不要手动调用Build() // 如果MainWindow是无参构造,Prism可以自动解析,但手动注册更稳妥: containerRegistry.Register<MainWindow>(); // 如果需要用Prism的导航功能,也可以用RegisterForNavigation: // containerRegistry.RegisterForNavigation<MainWindow>(); } protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { base.ConfigureModuleCatalog(moduleCatalog); // 没有模块的话留空即可 } } }
App.xaml
<prism:PrismApplication x:Class="MyNamespace.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:prism="http://prismlibrary.com/"> <Application.Resources> <!-- 按需添加资源 --> </Application.Resources> </prism:PrismApplication>
关键注意事项
- 绝对不要手动调用
ContainerBuilder.Build():Prism的Autofac集成已经封装了容器的构建流程,你手动干预只会破坏生命周期。 - 确保View和依赖被正确注册:如果
MainWindow有构造函数依赖,一定要在RegisterTypes里注册对应的服务,否则解析时还是会报错。 - 避免提前解析依赖:不要在
RegisterTypes或者模块的Initialize方法里直接调用Container.Resolve(),所有依赖都应该通过构造注入的方式获取。
内容的提问来源于stack exchange,提问作者Bogey
相关产品推荐
相关产品推荐

