【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个类:PrismApplicationIContainerExtension的实现,以及一个扩展类来检索底层容器,以防你需要访问它未被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模式的应用程序,它支持依赖注入,这有助于构建可维护和可测试的应用程序,并减少对静态和循环引用的依赖。

  1. Prism团队提供了多个DI容器实现:Prism框架提供了几种不同的DI容器实现,这些容器实现了Prism的IoC(控制反转)抽象。

  2. 容器、可用性和备注 :表格列出了几种不同的容器及其可用性和备注。

    • DryIoc:这是一个开源的DI容器,可以在NuGet.org上找到,并且支持所有目标平台。

    • Grace:这是一个商业级的DI容器,需要商业许可。

    • Microsoft:这也是一个商业级的DI容器,需要商业许可。

    • Unity:这是一个开源的DI容器,但在Prism中只提供对Xamarin.Forms和WPF的遗留支持。

  3. 注意:虽然DryIoc和Unity容器可以在NuGet.org上找到,但它们仍然受到Prism许可证的约束。这意味着,即使这些容器是开源的,如果你使用它们作为Prism框架的一部分,你仍然需要拥有一个有效的Prism许可证。

相关链接

相关推荐
inputA1 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
海尔辛1 小时前
学习黑客5 分钟读懂Linux Permissions 101
linux·学习·安全
真的想上岸啊2 小时前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
每次的天空3 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
名誉寒冰3 小时前
# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
qt·学习·rpc
开发游戏的老王4 小时前
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
笔记·学习·虚幻
码农小嘉5 小时前
若依框架页面
学习
小新1105 小时前
微信小程序学习之轮播图swiper
学习·微信小程序·notepad++
邝邝邝邝丹6 小时前
React学习———React.memo、useMemo和useCallback
javascript·学习·react.js
一年春又来6 小时前
AI-02a5a6.神经网络-与学习相关的技巧-批量归一化
人工智能·神经网络·学习