WPF MVVM项目中使用Autofac与IHostBuilder如何在OnStartup中解析服务?
解决方法
你不需要单独保存ContainerBuilder或者容器引用,.NET通用主机(Generic Host)已经帮你封装好了Autofac的服务提供器,直接用host.Services即可解析服务。
具体修改步骤
- 先确认你已经在App类中声明了
IHost类型的全局成员变量:
public partial class App : Application { private IHost host; // 其他代码 }
- 删掉构造函数中
_containerBuilder = builder;这行代码,Host构建完成后ContainerBuilder就没有作用了,不需要保留引用。 - 修改
OnStartup方法,有两种解析服务的写法:
写法1:使用.NET内置的DI扩展(不需要额外引用Autofac命名空间)
protected override async void OnStartup(StartupEventArgs e) { await host.StartAsync(); // 直接通过主机的服务提供器解析服务 var mainVM = host.Services.GetRequiredService<IMainViewModel>(); var window = new MainWindow { DataContext = mainVM }; window.Show(); base.OnStartup(e); }
写法2:使用Autofac原生的Resolve API
如果需要用到Autofac特有的解析能力,可以将host.Services转换为Autofac的ILifetimeScope类型:
using Autofac; protected override async void OnStartup(StartupEventArgs e) { await host.StartAsync(); var lifetimeScope = host.Services as ILifetimeScope; var mainVM = lifetimeScope.Resolve<IMainViewModel>(); var window = new MainWindow { DataContext = mainVM }; window.Show(); base.OnStartup(e); }
额外注意
记得重写应用退出方法,释放主机资源,避免内存泄漏:
protected override async void OnExit(ExitEventArgs e) { await host.DisposeAsync(); base.OnExit(e); }
内容的提问来源于stack exchange,提问作者Narthe
相关产品推荐
相关产品推荐

