• (82) C# .net core 依赖注入


      

    控制反转的两种方式:1 服务定位器,2 依赖注入

    服务定位器

    一、服务定位器

    服务:就是找框架要的一个对象

    引入  Microsoft.Extensions.DependencyInjection

    对象生命周期

    1. AddTransient 瞬时生命周期

     每次serviceProvider.GetService<Test>(); 都会创建一个对象

    ServiceCollection services = new ServiceCollection();
    //把对象放入
    services.AddTransient<Test>();
    
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    Test testService = serviceProvider.GetService<Test>();
    testService.Name = "liu";
    testService.Hi();
    
    public interface ITestService
    {
        public string Name { get; set; }
        public void Hi();
    }
    
    public class Test : ITestService
    {
        public string Name { get ; set; }
    
        public void Hi()
        {
            Console.WriteLine($"打印{Name}");
        }
    }

    2.唯一对象AddSingleton

    services.AddSingleton<Test>();

    ServiceCollection services = new ServiceCollection();
    //把对象放入
    services.AddTransient<Test>();
    
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    Test testService = serviceProvider.GetService<Test>();
    testService.Name = "liu";
    testService.Hi();
    
    Test testService1 = serviceProvider.GetService<Test>();
    testService1.Name = "tom";
    testService.Hi();
    testService1.Hi();

    3.范围内

    ServiceCollection services = new ServiceCollection();
    //把对象放入
    services.AddScoped<Test>();
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    
    //IServiceScope域 范围内相同
    using (IServiceScope servicesScope = serviceProvider.CreateScope())
    {
        Test testService = servicesScope.ServiceProvider.GetService<Test>();
        Test testService2 = servicesScope.ServiceProvider.GetService<Test>();
    
        
    
    }
    
    using (IServiceScope servicesScope2 = serviceProvider.CreateScope())
    {
        Test testService = servicesScope2.ServiceProvider.GetService<Test>();
        Test testService2 = servicesScope2.ServiceProvider.GetService<Test>();
    
    }

    使用接口实现

    ServiceCollection services = new ServiceCollection();
    //传入接口和实现类
    services.AddTransient<ITestService,Test>();
    ServiceProvider serviceProvider = services.BuildServiceProvider();
    //
    ITestService testService = serviceProvider.GetService<ITestService>();
    
    testService.Name = "liu";
    testService.Hi();
    //查看testService实际类型为Test
    Console.WriteLine(testService.GetType());

    二、依赖注入

    ServiceCollection services = new ServiceCollection();
    services.AddTransient<Test>();
    services.AddTransient<A>();
    var s=services.BuildServiceProvider().GetService<Test>();
    s.ok();
    
    public interface ITest
    {
        void ok();
    }
    
    public class Test : ITest
    {
        A a;
        public Test(A a)
        {
            this.a = a;
        }
        public void ok()
        {
            Console.WriteLine("打印ok方法");
            a.AAA();
        }
    }
    
    public interface IA
    {
        void AAA();
    }
    
    public class A
    {
        public void AAA()
        {
            Console.WriteLine("打印AAA方法");
        }
    }
  • 相关阅读:
    【ASP.NET 进阶】根据IP地址返回对应位置信息
    【网络文摘】编程的智慧
    【ASP.NET 类库】当你懒得用 Json+Ajax 时,可以试试 AjaxPro
    【iOS 初见】第一个简单的 iOS 应用
    【C#】C# 实现发送手机短信
    【网络文摘】一家公司要了你后,凭什么给你开高工资?
    深入理解Java虚拟机01--概述
    Java虚拟机(五)Java的四种引用级别
    OkHttp3源码详解(六) Okhttp任务队列工作原理
    OkHttp3源码详解(五) okhttp连接池复用机制
  • 原文地址:https://www.cnblogs.com/buchizaodian/p/15809271.html
Copyright © 2020-2023  润新知