Prism Dependency Injection
1.注册类型(Registering Types)
1.1. Prism中的服务生命周期:
- Transient(瞬态):每次请求服务或类型时,都会获得一个新的实例。
- Singleton(单例):每次请求服务或类型时,都会获得同一个实例。
- Scoped(作用域):在每个容器作用域中获得一个新的实例,但在特定的容器作用域内保持同一个实例。
1.2. Prism中的默认作用域:
- Prism默认不使用作用域,除了在Prism.Maui中,它会为每个页面创建一个作用域。这种作用域用于
INavigationService
、IPageDialogService
和IDialogService
等服务。
1.3. 与ASP.NET Core的比较:
- 如果你熟悉ASP.NET Core,你可能知道三种基本的依赖注册类型:Transients、Singletons和Scoped Services。与Web环境中许多服务围绕用户请求进行作用域划分不同,桌面和移动应用通常只处理单个用户。因此,我们需要决定服务是作为整个应用中重复使用的单个实例,还是每次请求时创建新实例,并在完成后由垃圾回收器清理内存。
1.4. Prism对命名服务注册的要求:
- Prism严格要求使用命名服务注册。这使得Prism能够注册页面以供导航,并在之后根据URI片段(如MyMasterDetailPage/NavigationPage/ViewA)解析它。任何不支持命名服务的依赖注入容器都不能被Prism团队官方实现。
2.注册瞬态(Transient)服务
瞬态服务是指每次请求服务或类型时都会创建一个新的实例。在Prism中,如果你期望每次创建服务时都生成一个新的实例,你可以通过调用Register
方法并提供服务类型和服务实现类型来注册这样的服务。除非在某些情况下,直接注册具体类型(concrete type)可能是合适的。
// Where it will be appropriate to use FooService as a concrete type
containerRegistry.Register<FooService>();
containerRegistry.Register<IBarService, BarService>(