首页 > 其他分享 >DependencyInjection组件实现IOC控制反转(2)

DependencyInjection组件实现IOC控制反转(2)

时间:2023-12-16 23:44:48浏览次数:23  
标签:容器 IInterfaceA services 服务类型 注册 AddTransient 组件 DependencyInjection IOC

目的:讲解DependencyInjection组件实现IOC的步骤

1、添加Nuget包:Micosoft.Extensions.DependencyInjection

2、创建容器:

//创建容器
ServiceCollection services = new ServiceCollection();

 

3、注册:把服务注册进容器的过程

    有两个概念需要说明下:

         服务类型(service type):指用户根据什么类型来获取,服务类型可以时接口,也可以是类,建议使用接口,面向接口编程,更灵活

         实现类型(implementation type):指真正实现服务的类到底是什么

       注册时,可以服务类型和实现类型一致(两个一样的类),也可以服务类型是接口,实现类型是继承于接口的类

如下:IInterfaceA是一个接口,ImplementA是继承于接口IInterfaceA的类

 //服务类型和实现类型一致
 services.AddTransient<ImplementA,ImplementA>();
 //服务类型和实现类型不一致
 services.AddTransient<IInterfaceA, ImplementA>();

      当然,注册时还有很多重载方法,比如:AddTransient(Type serviceType,implementationType),AddTransient(Type  serviceType),AddTransient<Type  serviceType>()等等,自己查看文档就可以了

 

   我上面演示的注册都用了AddTransient只是为了方便说明注册的过程,实际上注册还要关注注册对象的生命周期,有以下三种:

    Transient:瞬态,每次获取容器相当与new一个新的对象

     Scoped:范围,在一个scope范围内是同个对象

    Singleton:单例,在整个应用程序中都是同个对象

 public interface IInterfaceA
 {
    string Name { get; set; }
     void DoSomething();
     
 }

 public class ImplementA : IInterfaceA
 {
     string IInterfaceA.Name { get; set; }

     void IInterfaceA.DoSomething()
     {
         Console.WriteLine("我是 ImplementA,继承于IInterfaceA");
     }
 }
static void Main(string[] args)
{
    //创建容器
    ServiceCollection services = new ServiceCollection();
    //注册
    //services.AddTransient<ImplementA>();//注册方式1:直接注册实现类
    services.AddTransient<IInterfaceA,ImplementA>();//注册方式2:注册服务类型和对应的实现类,推荐使用
}

 

4、获取容器中的对象,有两种方式:

     1)使用服务定位器(ServiceLocator),使用容器的BuildServiceProvider()方法获取ServiceProvider,通过ServiceProvider以下方法获取服务

        T  GetService<T>():如果获取不到服务,则返回null

        Object GetService(Type  serviceType):返回的是Object类型,使用时还需要进行类型转换,一般不用,除了在写框架时,通过反射拿到类型

       T GetRequiredService<T>():Required,必须的,如果获取不到服务,则抛异常,

      object GetRequiredService(Type serviceType):

      IEnumerable<T> GetServices<T>():适用于可能有很多满足条件的服务

      IEnumerable<object> GetServices(Type serviceType):

      注意,如果容器中注册了同个服务的多个实现类型,那么使用 GetService、GetRequiredService获取服务时,都是获取到最后注入容器的实现类型

      

 //使用服务定位方式获取容器对象
 using (ServiceProvider service = services.BuildServiceProvider())
 {
     service.GetRequiredService<IInterfaceA>();
     IInterfaceA a=  service.GetService<IInterfaceA>();
     a.DoSomething();
 }

   

     2)通过依赖注入的方式:一般是使用构造函数注入

      

     

 

标签:容器,IInterfaceA,services,服务类型,注册,AddTransient,组件,DependencyInjection,IOC
From: https://www.cnblogs.com/luohualiushui1173/p/17904626.html

相关文章

  • uniapp的editor组件在H5上无法点击的问题处理
    uniapp开发的移动端H5和小程序,富文本框输入框使用了editor的组件在小程序端是运行正常的,但是在H5端出现了无法点击的情况,是好时坏原因是H5端依赖远端的quill.min.js组件,该远端的组件偶尔会出现访问的情况文档上写的比较清楚,但是具体怎么写没有写的写的很具体  经常尝试,搞定......
  • C++ Qt开发:Tab与Tree组件实现分页菜单
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍tabWidget选择夹组件与TreeWidget树形选择组件,的常用方法及灵活运用。1.1TabWidgetQTabWidget......
  • MySQL 8 密码验证组件
    验证密码(validate_password)组件通过要求输入账户密码和对潜在密码进行强度测试来提高安全性。在MySQL8.0中,validate_password插件是以validate_password组件的方式实现的。插件的方式仍然可以实用,但是已经过期,未来可能被移除。validate_password提供了一个函数validate_pas......
  • C++ Qt开发:ToolBar与MenuBar菜单组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍ToolBar工具栏组件以及与之类似的MenuBar菜单栏组件的常用方法及灵活运用。1.1QToolBar工具栏......
  • popper/tooltip 组件
    在element-plus中,popper组件是tooltip、select、date-picker等触发式弹出层组件的基础,有了它就可以封装各种类似功能的组件了。popper组件依赖于floating-ui,是对floating-ui的高级封装。最终效果展示今天的完整代码放在play/src/components/popper里了popper组件......
  • 开源组件DockerFIle老是Build失败,如何解决
    推荐把外网地址替换为国内高速镜像#替换源地址http://dl-cdn.alpinelinux.org/alpine===https://mirrors.aliyun.com/alpinehttps://repo1.maven.org/maven2=====https://maven.aliyun.com/repository/public#goinstall代理proxy.golang.orggoenv-wGO11......
  • C++ Qt开发:DateTime日期时间组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QDateTime日期与时间组件的常用方法及灵活运用。在Qt中,日期和时间的处理通常使用QDateTime类。......
  • 日期选择器(date-picker)组件
    在工作中,经常需要使用日期选择器来让用户方便地选择日期。实现一个日期选择器组件。先来看看今天要实现的效果基础布局popper和日期选择器对应的元素触发器:也就是输入框弹出层:日期面板看看下面的基础布局,为了简化对时间的操作,这里使用dayjsdate-picker.ts//date-pi......
  • Sortable 拖拽排序组件实现原理
    如果想要实现拖拽排序功能,有很多现成的库可以供使用,比如Sortable.js(vuedraggable)、dnd-kit(react-dnd)等可以轻松帮助实现这一功能。本文的目标不是介绍如何使用这些库,而是手动实现一个简单版的Sortable组件。通过本文的阅读,您将深入了解拖拽排序的核心原理。使用模板使用Sor......
  • vue3Cron表达式组件
    npm安装no-vue3-cron引入报错,就直接把代码拿来自己改了no-vue3-cron仓库地址:https://github.com/wuchuanpeng/no-vue3-cronvue-cron.vue<stylelang="scss">.no-vue3-cron-div{.language{position:absolute;right:25px;z-index:1;}.el-tabs{......