C# DI依赖注入

2023-12-15 15:59:34
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实例会被创建,并且每次请求该服务时都会返回同一个实例。

文章来源:https://blog.csdn.net/weixin_50784508/article/details/134937376
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。