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

依赖注入

时间:2024-07-07 23:20:57浏览次数:9  
标签:依赖 Name 对象 GetService SayHi Lily public 注入

被子太轻,压不住想你的心。 --zhu
依赖注入概念
生活中的“控制反转”:
自己发电和用电网的电。
依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的实现方式。
依赖注入简化模块的组装过程,降低模块之间的耦合度。

代码控制反转的目的
“怎么创建XX对象”->“我要XX对象”
两种实现方式:
(1)服务定位器(ServiceLocator);

IDbConnection conn=ServiceLocator.GetService<IDbConnection>();

(2)依赖注入(Dependency Injection,DI);

class Demo
{
  public IDbConnection Conn{get;set;}
  public void InsertDB()
  {
    IDbConnection  cmd=Conn.CreateCommand();
  }
}

DI概念
服务(Service):对象;
注册服务;
服务容器:负责管理注册的服务;
查询服务:创建对象及关联对象;
对象生命周期:Transient(瞬态);Scoped(范围);Singleton(单例);

.NET中使用DI
1.Install-Package Microsoft.Extensions.DependencyInjection
2.using Microsoft.Extensions.DependencyInjection
3.ServiceCollection用来构造容器对象IServiceProvider()创建的ServiceProvider,可以用来获取BuildServiceProvider()之前ServiceCollection中的对象。

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            services.AddTransient<TestServiceImpl>();
            //services.AddSingleton<TestServiceImpl>();
            //services.AddScoped<TestServiceImpl>();

            using (ServiceProvider sp = services.BuildServiceProvider())//服务定位器 ServiceProvider
            {
                TestServiceImpl t = sp.GetService<TestServiceImpl>();
                t.Name = "Lily";
                t.SayHi();

                TestServiceImpl t1 = sp.GetService<TestServiceImpl>();
                t1.Name = "Tom";
                t1.SayHi();
                Console.WriteLine(object.ReferenceEquals(t, t1));
                t.SayHi();


                TestServiceImpl tt1;
                using (IServiceScope scope = sp.CreateScope())
                {
                    TestServiceImpl ts= scope.ServiceProvider.GetService<TestServiceImpl>();
                    t.Name = "Lily";
                    t.SayHi();
                    tt1 = ts;
                }

                using (IServiceScope scope = sp.CreateScope())
                {
                    TestServiceImpl ts = scope.ServiceProvider.GetService<TestServiceImpl>();
                    t.Name = "Lily";
                    t.SayHi();
                    Console.WriteLine(object.ReferenceEquals(tt1, ts));
                }
            }

   
                Console.Read();
        }
    }

    internal class TestServiceImpl : ITestService
    {
        public string Name { get ; set; }

        public void SayHi()
        {
            Console.WriteLine($"Hi,I'm {Name}");
        }
    }
    public interface ITestService
    {
        public string Name { get; set; }
        public void SayHi();
    }
}

结果:

Hi,I'm Lily
Hi,I'm Tom
False
Hi,I'm Lily
Hi,I'm Lily
Hi,I'm Lily
False

生命周期
1.给类构造函数中打印,看看不同生命周期的对象创建,使用serviceProvider.CreateScope()创建Scope。
2.如果一个类实现了IDisposable接口,则离开作用域之后,容器会自动调用对象的Dispose方法。
3.不要在长生命周期的对象中引用比它短的生命周期的对象。在.NET Core中,会默认抛异常。
4.生命周期的选择:如果类无状态,建议为Singleton;如果类有状态,且有Scpoe控制,建议为Scoped,因为通常这种Scope控制下的代码都是运行在同一个线程中的,没有并发修改的问题;在使用Transient的时候要严谨。
5..NET注册服务的重载方法很多,多看官方文档。

IServiceProvider的服务定位器方法:
1.T GetService() 如果获取不到对象,则返回null。(多个时,返回最后一个注册的)
object GetService(Type serviceType)
2.T GetRequireService() 如果获取不到对象,则抛异常。
object GetRequireService(Type serviceType)
3.IEnumerable GetServices()适用于可能有很多满足条件的服务。(多个s)
IEnumerable

标签:依赖,Name,对象,GetService,SayHi,Lily,public,注入
From: https://www.cnblogs.com/zhusichen/p/18287039

相关文章

  • Yi.Admin+Blazor上手教程系列5-新项目可依赖的项目列表
    src项目下各个模块的依赖的项目Application域Yi.Abp.Application.ContractsYi.Abp.DomainYi.Framework.Bbs.ApplicationYi.Framework.ChatHub.ApplicationYi.Framework.CodeGen.ApplicationYi.Framework.Ddd.ApplicationYi.Framework.Rbac.ApplicationYi.Framework.Sett......
  • 52-3 权限维持 - IFEO注入(镜像劫持)
    IFEO注入(映像劫持)介绍IFEO(ImageFileExecutionOptions)位于Windows注册表中的路径为:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptionsIFEO最初设计用于为在默认系统环境下可能出现错误的程序提供特殊的调试和执行环境。通过......
  • spring-关于组件的注入及获取流程
    一、组件注入的基本流程:容器初始化:Spring应用启动时,会读取配置(如XML配置、注解配置等),并根据这些配置创建Bean定义(BeanDefinition)。根据Bean定义,Spring容器实例化Bean,并管理它们之间的依赖关系。依赖解析与注入:当一个Bean依赖于另一个Bean时,Spring容器负责查找并注入这个依赖......
  • Bug 解决 | 前端项目无法正确安装依赖?
    当前端项目无法正确安装依赖时,这通常是由于多种原因导致的。以下是一些解决这一问题的步骤和建议:1.检查网络连接确保你的计算机可以访问外部网络,特别是npm或yarn的仓库。如果你在中国大陆,可能需要配置npm或yarn的镜像源,如使用淘宝的npm镜像(cnpm)或yarn的国内镜像。2.清理缓......
  • 【漏洞复现】Geoserver XPath表达式注入致远程代码执行漏洞(CVE-2024-36401)
    0x01产品简介GeoServer是一个开源服务器,用于共享、处理和编辑地理空间数据。它支持多种地图和数据标准,使用户能够通过网络访问和操作地理信息系统(GIS)数据。0x02漏洞概述2024年7月,互联网上披露Geoserver表达式注入致远程代码执行漏洞(CVE-2024-36401),攻击者无需认证即可利......
  • IDEA导入依赖+Maven配置
    Maven安装及配置安装安装链接:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/注:建议不要直接安装最新版本,选用常用、稳定的版本安装即可,比如:3.6.3配置1>配置bash_profile文件终端输入:vi~/.bash_profile进入插入模式后插入以下内容,再保存退出:#Se......
  • Docker打包rust时版本依赖问题
    rust程序在服务器上能打包成功,但在Dockerfile运行时始终报依赖错误,涉及版本太多即使手动改.lock文件效果也不理想,切换镜像无效果>[4/4]RUNcargoinstall--path.:0.426Installingbackendv0.1.0(/backend)......
  • Maven依赖排除和冲突解决
    maven中有很多包会重复引入依赖,首先jar包冲突后会有就近原则和先声明者优先(前面的优先)作为一个专业的开发,我们掌握的工具必须齐全,尽量少重复造轮子,但要知道轮子原理:mavenhelp其次是依赖排除,这两张图显示.Conflicts显示重复依赖AllDependenciesasList集合形式显示......
  • node-sass 依赖包无法安装的解决方法
     一、问题描述重装Node后,重新启动项目,报错未找到node-sass模块试过各种npm方法后依然无效,于是放弃安装。 网上常见的解决方法使用cnpm:cnpminstallnode-sass--save(失败)指定镜像源:npminode-sass--save--sass_binary_site=https://npm.taobao.org/mirrors/node......
  • 【漏洞复现】用友时空-KSOA-SQL注入-linkadd
    免责声明此内容仅供技术交流与学习,请勿用于未经授权的场景。请遵循相关法律与道德规范。任何因使用本文所述技术而引发的法律责任,与本文作者及发布平台无关。如有内容争议或侵权,请及时私信我们!0x01产品简介用友时空KSOA是建立在SOA理念指导下研发的新一代产品,是根据流......