【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许可证。

相关链接

相关推荐
Yeats_Liao1 天前
MindSpore开发之路(二十六):系列总结与学习路径展望
人工智能·深度学习·学习·机器学习
modelmd1 天前
Go 编程语言指南 练习题目分享
开发语言·学习·golang
Nan_Shu_6141 天前
学习: Threejs (2)
前端·javascript·学习
学历真的很重要1 天前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
码农小韩1 天前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
嵌入式-老费1 天前
外壳3D结构设计(学习的方法)
学习
山土成旧客1 天前
【Python学习打卡-Day40】从“能跑就行”到“工程标准”:PyTorch训练与测试的规范化写法
pytorch·python·学习
Yyuanyuxin1 天前
保姆级学习开发安卓手机软件(一)--安装软件及配置
学习
●VON1 天前
跨模态暗流:多模态安全攻防全景解析
人工智能·学习·安全·von
星火开发设计1 天前
C++ map 全面解析与实战指南
java·数据结构·c++·学习·算法·map·知识