使用Prism库开发模块化应用程序
使用依赖注入来实现松耦合
一个模块可能依赖于宿主应用程序或其他模块提供的组件和服务。Prism支持注册模块之间的依赖关系,以便它们可以按正确的顺序加载和初始化。Prism还支持在加载模块到应用程序时对其进行初始化。在模块初始化期间,模块可以检索需要的附加组件和服务的引用,并/或注册任何它包含的组件和服务,以使它们可供其他模块使用。
一个模块应该使用一个独立的机制来获取外部接口的实例,而不是直接实例化一个具体类型,例如您可以使用依赖注入容器或工厂模式。依赖注入容器(如Unity或DryIoc)允许类型通过依赖注入的方式自动获取它所需的接口和类型的实例。Prism与Unity和DryIoc进行了集成,以便模块可以轻松使用依赖注入。
下图显示了加载需要获取或注册组件和服务的模块时的典型操作序列。
在这个例子中,OrdersModule
组件定义了一个OrdersRepository
类(以及其他实现订单功能的视图和类)。CustomerModule
组件定义了一个CustomersViewModel
类,该类依赖于OrdersRepository
,并通常基于服务暴露的接口。应用的启动和引导过程包括以下步骤。
- 从
PrismApplication
派生的App
类启动模块初始化过程,模块加载器加载并初始化OrdersModule
。 - 在
OrdersModule
的初始化过程中,它会向容器注册OrdersRepository
。 - 然后,模块加载器会加载
CustomersModule
。模块加载顺序可以根据模块元数据中的依赖关系进行指定。 CustomersModule
通过容器来解析和构造CustomerViewModel
的实例。CustomerViewModel
依赖于OrdersRepository
(通常基于它的接口),并通过构造函数或属性注入来指示它。容器根据OrdersModule
注册的类型在视图模型的构造中注入依赖项。最终结果是一个从CustomerViewModel
到OrderRepository
的接口引用,这些类之间没有紧密耦合。
注意: 用于暴露OrderRespository
( IOrderRepository
)的接口可以驻留在单独的“共享服务”程序集中,或者仅包含暴露这些服务所需的服务接口和类型的“订单服务”程序集中。这样,CustomersModule
和OrdersModule
之间就没有硬依赖关系了。
请注意,两个模块都隐式依赖于依赖注入容器。此依赖关系在模块加载器的模块构建期间注入。