首页 > 其他分享 >Prism IoC 依赖注入

Prism IoC 依赖注入

时间:2023-08-18 11:24:35浏览次数:38  
标签:MD5Provider containerRegistry 依赖 container Prism RegisterSingleton IoC 注入

现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Prism中的依赖注入方式,将自定义的服务注册到SinglePageApp项目中。

 

1. 认识 Prism 中的依赖注入
Prism项目中的 App 继承于 PrismApplication ,必须要重写 CreateShell() 和 RegisterTypes() 方法,其中 RegisterTypes()用于依赖注入容器,该函数使用 IContainerRegistry 类型的对象将用户自定义的对象注入容器。

在Prism源码中,已经提前向IOC容器注入了如下内容:

 


protected virtual void RegisterRequiredTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IApplicationProvider, ApplicationProvider>();
containerRegistry.RegisterSingleton<IApplicationStore, ApplicationStore>();
containerRegistry.RegisterSingleton<IEventAggregator, EventAggregator>();
containerRegistry.RegisterSingleton<IKeyboardMapper, KeyboardMapper>();
containerRegistry.RegisterSingleton<IPageDialogService, PageDialogService>();
containerRegistry.RegisterSingleton<IDialogService, DialogService>();
containerRegistry.RegisterSingleton<IDeviceService, DeviceService>();
containerRegistry.RegisterSingleton<IPageBehaviorFactory, PageBehaviorFactory>();
containerRegistry.RegisterSingleton<IModuleCatalog, ModuleCatalog>();
containerRegistry.RegisterSingleton<IModuleManager, ModuleManager>();
containerRegistry.RegisterSingleton<IModuleInitializer, ModuleInitializer>();
containerRegistry.RegisterScoped<INavigationService, PageNavigationService>();
containerRegistry.Register<INavigationService, PageNavigationService>(NavigationServiceName);
}
有了这些内容,就可以在窗体里通过构造函数直接注入对象,如

public partial class MainWindow : Window
{
private IContainerExtension _container;
private IModuleManager _moudleManager;
private IRegionManager _regionManager;
private IEventAggregator _eventAggregator;

public MainWindow(IContainerExtension container, IModuleManager moudleManager,IRegionManager regionManager, IEventAggregator eventAggregator)
{
InitializeComponent();
this._container = container;
this._moudleManager = moudleManager;
this._regionManager = regionManager;
this._eventAggregator = eventAggregator;
}
}
这样就可以使用容器中注入的对象。

2. 通过 App.xaml.cs 中的 RegisterTypes() 函数接口将对象注入容器
如果自定义了第三方对象,如 SinglePageApp.Services 中有两个自定义的服务 MD5Provider 和 Password,想将这2个对象注入Prism中的容器,供前端界面使用,可以重写 App.xaml.cs 中的 RegisterTypes() 函数接口,通过 IContainerRegistry 类型的对象将自定义的服务注入 IOC 容器。这里以MD5Provider 注入为例。

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Register<MD5Provider>();
}
然后在你要用它的地方,如 IndexViewModel.cs 中,通过构造函数从 IOC 容器里将对象解析出来。

private readonly MD5Provider _provider1;
private readonly MD5Provider _provider2;
private readonly IContainerExtension _container;

public IndexViewModel(IContainerExtension container)
{
_container = container;
_provider1 = container.Resolve<MD5Provider>();
_provider2 = container.Resolve<MD5Provider>();
}
注意:使用 Register 方法注入,每次解析都会创建一个新的对象,所以 _provider1 == _provider2 是不成立的;如果在RegisterTypes()中没有将对象 MD5Provider 注入容器,在构造函数中解析的时候也会自动创建一个MD5Provider 对象。

依赖注入的几种方法:

Register:每一次解析都会创建一个实例
RegisterSingleton :整个应用程序生命周期以内只创建一个实例(单例)
RegisterScoped :在同一个Scope内只初始化一个实例
使用 RegisterScoped 注入,则 _provider1 == _provider2 成立,因为它们2个对象处于同一个Scope。

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterScoped<MD5Provider>();
}
使用 RegisterSingleton 注入,则 _provider1 == _provider2 成立,因为 MD5Provider 是单例,整个应用程序只有一个它的实例。

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<MD5Provider>();
}
在构造函数中注入对象时,也可以直接传入对象,不用手动调用 Resolve 方法进行解析,如

private readonly MD5Provider _provider1;
private readonly MD5Provider _provider2;

public IndexViewModel(MD5Provider provider1, MD5Provider provider2)
{
_provider1 = provider1;
_provider2 = provider2;
}
3. 以模块的方式注入容器
为 SinglePageApp.Services 项目建立一个模块描述文件 ServicesProfile.cs ,继承接口 Imodule ,在模块描述文件中进行依赖注入。(该方法要在SinglePageApp.Services 项目安装 Prism.DryIoc)

public class ServicesProfile : IModule
{
public void OnInitialized(IContainerProvider containerProvider)
{

}

public void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Register<MD5Provider>();
containerRegistry.Register<Password>();
}
}
然后在 App.xaml.cs 中重写 ConfigureModuleCatalog 函数加载模块,实现模块的整体注入。

protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<ServicesProfile>();

base.ConfigureModuleCatalog(moduleCatalog);
}

Jiestriker
关注

————————————————
版权声明:本文为CSDN博主「Jiestriker」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38318941/article/details/124062641

标签:MD5Provider,containerRegistry,依赖,container,Prism,RegisterSingleton,IoC,注入
From: https://www.cnblogs.com/webenh/p/17639910.html

相关文章

  • WPF利用依赖属性和命令编写自定义控件
    以实例讲解(大部分讲解在代码中)1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试,12345678910111213141516171819<UserControlx:Class="SelfControlDenpendy.SelfControl"             xmlns="http://schem......
  • Spring源码学习笔记13——总结篇, 从IOC到AOP
    系列文章目录和关于我零丶序言在《Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点》中,我们总结了SpringIOC部分的知识,为了更好的给群里的伙伴们分享SpringAOP的知识,遂有了这篇文章,这篇文章将从IOC聊到AOP,其中IOC不会那么细致,重点还是在AOP。一丶引入1.AOP概述......
  • python项目 如何快速的导入和导出依赖包
    Python项目依赖包【导出】第一步:安装pipreqs包pip3installpipreqs第二步骤:进入项目的根目录执行以下命令:cd根目录第三步:转成requirements.ext文件:pipreqs./--encoding=utf-8--force如果成功,就会在根目录下生成一个requirements.txt文件,内容为本项目环境以来包已经对......
  • IOC控制反转
    IOC控制反转,是一种程序设计思想。在了解IOC控制反转我们首先先了解以下几个概念1、理解DIP(依赖反转原则)2、理解DI设计模式2、DI(依赖注入)3、IOC容器一、环境讲解首先我们要先理解其中我们的IOC、和DIP只是一种编程中的原则,是按照这套原则进行的操作,然后DI(依赖性注入)是我们......
  • IOC和DI
    IOC:控制反转是一种设计原则,把自己创建对象的过程交给Spring容器帮我们创建,在这个过程中常用的注解有4个:@component、@controller、@service、@repository(不常用)对象有两种模式单例,每次的对象都是那一个,完全由Spring容器来全权管理多例,每次都是一个全......
  • C# .NET6 WPF 依赖注入
    入口文件:App.xaml.csusingMicrosoft.EntityFrameworkCore;usingMicrosoft.Extensions.Configuration;usingMicrosoft.Extensions.DependencyInjection;usingSerilog;usingSystem;usingSystem.IO;usingSystem.Text;usingSystem.Windows;namespaceDemo{......
  • 利用CI机制管控jar依赖树 | 京东云技术团队
    1.现状·问题你还记得你排查jar冲突的付出么?为了有效控制jar包更新带来的未知jar引入和变动,我们经常使用dependency-tree来查看依赖关系排查问题,通常是出现问题再被动分析和排查,此时人力成本是巨大的,同时系统已出问题,没有后悔药。2.分析原因jar包依赖是异变的,且隐形的,jar冲突导致......
  • WPF如何构建MVVM+Prism+HandyControl ,模块化的桌面应用
    为何模块化模块化是一种分治思想,不仅可以分离复杂的业务逻辑,还可以进行不同任务的分工。模块与模块之间相互独立,从而构建一种松耦合的应用程序,便于开发和维护。开发技术.Net6+WPF+Prism(v8.0.0.1909)+HandyControl(v3.4.0)知识准备什么是MVVMModel-View-ViewModel......
  • SwiftUI+Combine 依赖注入->Clean架构
     Clean架构是一种软件设计理念,它将应用程序的关注点分成不同的层,每个层都有特定的责任。它被称为"Clean",因为它提倡代码易于阅读、测试和维护,并且不受特定框架或技术的约束。在使用SwiftUI和Combine框架用Swift编写的iOS应用程序的背景下,Clean的架构可能看起来像这样的东西:表......
  • IOC(控制反转)
    1、通过下面这个案例来理解IOC这种思想创建一个项目,建一个dao层的包。在包下建立一个UserDao接口,里面写一个方法。再写这个接口的几个实现类,每个实现类中的方法实现不同的效果。建一个service层的包,下面写一个UserService接口,然后写接口实现类,实现类就是调用Dao层的方法(用以下......