csharpshare.com
Show / Hide Table of Contents

使用Prism库开发模块化应用程序

Gitee仓库 Prism-Documentation-CH 时间 2023-3-30

使用依赖注入来实现松耦合

一个模块可能依赖于宿主应用程序或其他模块提供的组件和服务。Prism支持注册模块之间的依赖关系,以便它们可以按正确的顺序加载和初始化。Prism还支持在加载模块到应用程序时对其进行初始化。在模块初始化期间,模块可以检索需要的附加组件和服务的引用,并/或注册任何它包含的组件和服务,以使它们可供其他模块使用。

一个模块应该使用一个独立的机制来获取外部接口的实例,而不是直接实例化一个具体类型,例如您可以使用依赖注入容器或工厂模式。依赖注入容器(如Unity或DryIoc)允许类型通过依赖注入的方式自动获取它所需的接口和类型的实例。Prism与Unity和DryIoc进行了集成,以便模块可以轻松使用依赖注入。

下图显示了加载需要获取或注册组件和服务的模块时的典型操作序列。

依赖注入举例

在这个例子中,OrdersModule组件定义了一个OrdersRepository类(以及其他实现订单功能的视图和类)。CustomerModule组件定义了一个CustomersViewModel类,该类依赖于OrdersRepository,并通常基于服务暴露的接口。应用的启动和引导过程包括以下步骤。

  1. 从PrismApplication派生的App类启动模块初始化过程,模块加载器加载并初始化OrdersModule。
  2. 在OrdersModule的初始化过程中,它会向容器注册OrdersRepository。
  3. 然后,模块加载器会加载CustomersModule。模块加载顺序可以根据模块元数据中的依赖关系进行指定。
  4. CustomersModule通过容器来解析和构造CustomerViewModel的实例。CustomerViewModel依赖于OrdersRepository(通常基于它的接口),并通过构造函数或属性注入来指示它。容器根据OrdersModule注册的类型在视图模型的构造中注入依赖项。最终结果是一个从CustomerViewModel到OrderRepository的接口引用,这些类之间没有紧密耦合。

注意: 用于暴露OrderRespository ( IOrderRepository)的接口可以驻留在单独的“共享服务”程序集中,或者仅包含暴露这些服务所需的服务接口和类型的“订单服务”程序集中。这样,CustomersModule和OrdersModule之间就没有硬依赖关系了。

请注意,两个模块都隐式依赖于依赖注入容器。此依赖关系在模块加载器的模块构建期间注入。

本文导航
返回顶部 ©2022-2023 csharpshare.com    冀ICP备2022026743号-1     公安备案图标 冀公网安备 13052902000206号     Icons by Icons8