我见过两种方法: 方法一强制Shell在编译时引用所有模块(这似乎与Prism库的模块化特性的目的相反)。在此方法中,Bootstrapper使用编译时已知的类型配置容器。
在第二种方法中,Bootstrapper配置容器以提供容器类的实例(IUnityContainer或你有什么)。这允许Shell项目对加载的模块一无所知,但强制所有模块依赖于给定的DI框架(因为prism似乎没有配置容器的通用机制)。
哪种方法更好,或者我错过了一些重要的信息?
答案 0 :(得分:2)
容器中类型注册的方式取决于容器类型本身。 Prism完全支持两个容器:MEF和Unity。
您可以在Development Guide中了解类型注册:
使用Unity容器注册类型
初始化期间,a type可以注册其他类型,例如视图和服务。 去做这个, 该类型需要将容器注入模块构造函数中。注册也可以通过配置在代码外执行。
使用MEF注册类型
MEF使用基于属性的系统 使用容器注册类型。结果,添加类型 注册到容器很简单:它需要添加 [导出] 属性类型。
因此,使用Unity有两个选择:容器引用注入和配置。对于MEF,您可以使用属性和容器注入。
如果要使用其他容器实现,例如Autofac,则必须为Prism提供适配器。
开发基于Prism的应用程序,您必须选择一种DI容器类型。因此,将所有模块与一个DI框架耦合并没有错。当然,您可以通过使用例如IServiceLocator
界面。但正如Development Guide所述:
IServiceLocator
并不意味着是通用容器。 容器具有不同的使用语义,这通常会驱动它 决定选择容器的原因。在以下情况下,可能会 适合您使用
IServiceLocator
:
- 你是一个 独立软件供应商(ISV)设计第三方服务 需要支持多个容器。
- 您正在设计服务 在他们使用多个容器的组织中使用。