【WPF】Prism学习(六)
Prism Dependency Injection
1.依赖注入(Dependency Injection)
1.1. Prism与依赖注入的关系:
- Prism框架一直围绕依赖注入构建,这有助于构建可维护和可测试的应用程序,并减少或消除对静态和循环引用的依赖。
1.2. Prism 7之前的依赖注入问题:
- 在Prism 7之前,Prism的依赖注入主要围绕为Prism实现的各种容器。这导致了一些问题,例如文档可能展示了如何使用一个容器进行操作,但不一定反映了你为应用程序使用的容器的适当API。
1.3. Prism 7引入的新接口:
- Prism 7引入了几个新的接口来抽象Prism对依赖注入的需求。这样做有几个好处,包括:
- 文档将始终展示你需要做什么,而不需要关心你使用的是哪个依赖注入容器。
- 这大大简化了需要添加到任何特定容器包中的内容。对于Prism.Forms来说,这减少了每个容器特定项目的3个类:
PrismApplication
、IContainerExtension
的实现,以及一个扩展类来检索底层容器,以防你需要访问它未被Prism实现的API。
1.4. Prism 9的变化:
- 在Prism 9中,Prism IoC层已从Prism.Core中移除,现在独立于Prism发布。这使得我们更容易在所有支持的Prism平台(WPF、Uno Platform、.NET MAUI等)之间共享容器实现。
- Prism 9还进行了额外的工作,以使容器更好地集成Microsoft.Extensions.DependencyInjection,并为容器作用域场景提供更好的支持,这些场景在Prism.Maui中被广泛使用。
总结来说,Prism框架通过依赖注入提供了一种构建应用程序的方式,使得应用程序更加模块化、易于测试和维护。随着Prism版本的更新,它不断改进对依赖注入的支持,使其更加灵活和易于使用。
2.使用微软的IServiceCollection
2.1. Prism 9.0与IServiceCollection的整合:
- Prism 9.0版本将容器实现从主Prism仓库中分离出来,这样做的好处是可以在不同平台之间共享容器,而不需要与Prism.Core有特定的代码耦合。
2.2. 支持.NET MAUI和Uno.Extensions:
- 通过添加对Microsoft的IServiceCollection的支持,Prism能够更好地支持.NET MAUI应用程序和Uno.Extensions使用的IHostBuilder方法。
2.3. 考虑使用Microsoft库的注册扩展:
- 当使用来自各种Microsoft库的注册扩展时,需要注意这些扩展通常是为Web应用程序量身定制的。例如,如果使用EntityFrameworkCore,DbContext的默认生命周期会被设置为Scoped(有作用域的)。
2.4. 生命周期管理的重要性:
- 对于大多数Prism应用程序,你可能希望将DbContext的生命周期设置为Transient(短暂的),因为Singleton(单例)可能会导致数据库访问问题,如果不同的视图模型或服务同时访问数据库。
2.5. 评估预构建的扩展方法:
- 建议花时间评估任何预构建的扩展方法,以确保注册的服务对于你的应用程序来说具有适当的生命周期。
3.容器(Containers)
Prism是一个流行的.NET框架,用于构建基于MVVM模式的应用程序,它支持依赖注入,这有助于构建可维护和可测试的应用程序,并减少对静态和循环引用的依赖。
-
Prism团队提供了多个DI容器实现:Prism框架提供了几种不同的DI容器实现,这些容器实现了Prism的IoC(控制反转)抽象。
-
容器、可用性和备注:表格列出了几种不同的容器及其可用性和备注。
-
DryIoc:这是一个开源的DI容器,可以在NuGet.org上找到,并且支持所有目标平台。
-
Grace:这是一个商业级的DI容器,需要商业许可。
-
Microsoft:这也是一个商业级的DI容器,需要商业许可。
-
Unity:这是一个开源的DI容器,但在Prism中只提供对Xamarin.Forms和WPF的遗留支持。
-
-
注意:虽然DryIoc和Unity容器可以在NuGet.org上找到,但它们仍然受到Prism许可证的约束。这意味着,即使这些容器是开源的,如果你使用它们作为Prism框架的一部分,你仍然需要拥有一个有效的Prism许可证。
相关链接
- 介绍(Introduction)
- 命令(Commands)
- 命令(Commanding)
- 复合命令(Composite Commands)
- 异步命令(Async Commands)
- 错误处理(Error Handling)
- 依赖注入(Dependency Injection)
- 依赖注入(Dependency Injection)