C# DI依赖注入

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ioc1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceCollection services = new ServiceCollection();
            //每次请求获取都是新的对象实例
            services.AddTransient<ITestService, TestServiceImpl>();
            //每次在一个生命周期中请求获取的都是同一个对象
            services.AddSingleton<TestServiceImpl2>();
            //同一个范围内获取的是同一个对象范围指“{}”再统一个大括号中的对象
            services.AddScoped<TestServiceImpl3>();
            using( ServiceProvider sp = services.BuildServiceProvider())
            {
                //GetService如果找不到服务,就返回null
                //GetRequiredService:必须的,如果找不到就报异常
                //GetServices找到服务的集合;
                ITestService t = sp.GetService<ITestService>();
                t.Name = "白沙王";
                t.SayHi();
                ITestService t1 = sp.GetService<ITestService>();
                Console.WriteLine(t.GetType());
                Console.WriteLine(object.ReferenceEquals(t,t1));
                t1.Name = "喜马拉雅";
                t1.SayHi();
                Console.WriteLine("----------------------");
                TestServiceImpl2 t2 = sp.GetService<TestServiceImpl2>();
                t2.Name = "白沙王";
                t2.SayHi();
                TestServiceImpl2 t21 = sp.GetService<TestServiceImpl2>();
                Console.WriteLine(object.ReferenceEquals(t2, t21));
                t21.Name = "喜马拉雅";
                t21.SayHi();
                t2.SayHi();
                Console.WriteLine("----------------------");
                using (IServiceScope scope1 = sp.CreateScope())
                {
                    //再scope中获取scope相关对象,scope.ServiceProvider而不是sp
                    TestServiceImpl3 t3 = scope1.ServiceProvider.GetService<TestServiceImpl3>();
                    t3.Name = "白沙王";
                    t3.SayHi();
                    TestServiceImpl3 t33 = scope1.ServiceProvider.GetService<TestServiceImpl3>();
                    t33.Name = "喜马拉雅";
                    t33.SayHi();
                    Console.WriteLine(object.ReferenceEquals(t3, t33));
                }
            }
                Console.ReadKey();
        }
    }
    interface ITestService
    {
        string Name { get; set; }
        void SayHi();
    }
    public class TestServiceImpl : ITestService
    {
        public string Name { get; set; }

        public void SayHi()
        {
            Console.WriteLine($"Hi,i'm{Name}");
        }

    }

    public class TestServiceImpl2 : ITestService
    {
        public string Name { get; set ; }

        public void SayHi()
        {
            Console.WriteLine($"你好,我是{Name}");
        }
    }


    public class TestServiceImpl3 : ITestService
    {
        public string Name { get; set; }

        public void SayHi()
        {
            Console.WriteLine($"you good,我是{Name}");
        }
    }
}

Nuget添加Microsoft.Extensions.DependencyInjection;引用

1.ServiceCollection services = new ServiceCollection();

这行代码创建了一个新的ServiceCollection实例。这是.NET Core中用于管理服务(也就是依赖项)的容器。

2.services.AddTransient<TestServiceImpl>();

这行代码向ServiceCollection中添加了一个名为TestServiceImpl的临时服务。AddTransient方法告诉.NET Core在每次请求该服务时创建一个新的实例。这意味着每次从服务提供者获取该服务时,都会得到一个新的TestServiceImpl实例。

3. using( ServiceProvider sp = services.BuildServiceProvider())

这行代码创建了一个ServiceProvider实例,该实例是.NET Core中实现依赖注入的实际对象。使用BuildServiceProvider方法后,你可以使用这个ServiceProvider实例来获取之前添加的服务。

4. TestServiceImpl t = sp.GetService<TestServiceImpl>();

这行代码使用创建的ServiceProvider实例sp来获取一个类型为TestServiceImpl的服务。由于之前使用的是AddTransient<TestServiceImpl>(),所以这里会得到一个新的TestServiceImpl实例。

5. t.Name = "白沙王";

这行代码给获取到的TestServiceImpl实例的Name属性赋值,将其设置为"白沙王"。

6. t.SayHi();

这行代码调用TestServiceImpl实例的SayHi方法。这个方法可能会输出一些信息,但由于你没有给出TestServiceImpl类的定义,我无法确定其具体行为。

总的来说,这段代码创建了一个服务,注册到了依赖注入容器中,并从容器中获取这个服务来使用。这是.NET Core应用中常见的依赖注入模式的一个例子。

services.AddSingleton<TestServiceImpl2>();

这行代码向ServiceCollection中添加了一个名为TestServiceImpl2的单例服务。这意味着在整个应用程序的生命周期中,只有一个TestServiceImpl2实例会被创建,并且每次请求该服务时都会返回同一个实例。

相关推荐

  1. .NET8 依赖注入

    2023-12-12 08:28:01       52 阅读
  2. C# DI依赖注入

    2023-12-12 08:28:01       57 阅读
  3. 【csharp】依赖注入

    2023-12-12 08:28:01       54 阅读
  4. SpringBoot整理-依赖注入

    2023-12-12 08:28:01       49 阅读
  5. WebSocketServer依赖注入问题

    2023-12-12 08:28:01       49 阅读
  6. Spring 依赖注入

    2023-12-12 08:28:01       33 阅读
  7. golang wire 依赖注入

    2023-12-12 08:28:01       36 阅读
  8. SpringBoot Mockito 依赖注入

    2023-12-12 08:28:01       35 阅读
  9. Spring的依赖注入

    2023-12-12 08:28:01       33 阅读
  10. Spring之注解实现依赖注入

    2023-12-12 08:28:01       60 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 08:28:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 08:28:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 08:28:01       82 阅读
  4. Python语言-面向对象

    2023-12-12 08:28:01       91 阅读

热门阅读

  1. Linux中tar命令详解

    2023-12-12 08:28:01       52 阅读
  2. 选择排序和堆排序

    2023-12-12 08:28:01       57 阅读
  3. 个人博客搭建保姆级教程-Nginx篇

    2023-12-12 08:28:01       62 阅读
  4. 【Hadoop】修改YARN配置文件

    2023-12-12 08:28:01       53 阅读
  5. MySQL执行语句 Table ‘mysql.servers‘ doesn‘t exist

    2023-12-12 08:28:01       60 阅读
  6. go-zero接口签名

    2023-12-12 08:28:01       63 阅读
  7. SQL数据库-客观题 复习

    2023-12-12 08:28:01       51 阅读
  8. IO 流

    2023-12-12 08:28:01       69 阅读
  9. 第13节:Vue3 声明反应状态ref()

    2023-12-12 08:28:01       68 阅读
  10. 八大排序算法【上】

    2023-12-12 08:28:01       56 阅读
  11. Vue3.3.4中watch无法监测props的更改

    2023-12-12 08:28:01       54 阅读