C# DI依赖注入的实现示例

 更新时间:2023年12月12日 11:33:50   作者:白沙王  
依赖注入是一种实现的方法,用于减少代码之间的耦合,本文主要介绍了C# DI依赖注入的实现示例,具有一定的参考价值,感兴趣可以了解一下

本文介绍了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实例会被创建,并且每次请求该服务时都会返回同一个实例。

到此这篇关于C# DI依赖注入的实现示例的文章就介绍到这了,更多相关C# DI依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中String StringBuilder StringBuffer类的用法

    C#中String StringBuilder StringBuffer类的用法

    这篇文章给大家简单介绍下C#中String StringBuilder StringBuffer三个类的用法,需要的的朋友参考下吧
    2017-05-05
  • C# 判断语句详解与应用示例小结

    C# 判断语句详解与应用示例小结

    C#作为一种强大的编程语言,提供了丰富的判断语句,能够帮助我们实现复杂的程序逻辑,本文将详细解析 C# 的判断语句,包括它们的语法、使用方法以及在实际编程中的应用,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • C# 创建vba用的类库

    C# 创建vba用的类库

    本文详细介绍了如何在VBA中使用C#编写的COM组件,首先创建一个C#项目,定义ComVisible特性和生成GUID,然后修改.csproj文件并编译生成.dll文件,之后将该.dll文件注册到系统,最后在VBA代码中使用CreateObject方法创建该对象并调用其方法
    2026-04-04
  • C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色

    C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色

    这篇文章主要介绍了C# Winform使用扩展方法实现自定义富文本框(RichTextBox)字体颜色,通过.NET的静态扩展方法来改变RichTextBox字体颜色,需要的朋友可以参考下
    2015-06-06
  • C#简单数字图像处理程序

    C#简单数字图像处理程序

    这篇文章主要为大家详细介绍了C#简单数字图像处理程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C#如何动态设置屏幕分辨率

    C#如何动态设置屏幕分辨率

    这篇文章主要为大家详细介绍了C#动态设置屏幕分辨率的方法,我们可以使用Screen类设置屏幕分辨率,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • WinForm拖拽控件生成副本的解决方法

    WinForm拖拽控件生成副本的解决方法

    这篇文章主要介绍了WinForm拖拽控件生成副本的解决方法,对C#新手有一定的学习借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C# 元组和值元组的具体使用

    C# 元组和值元组的具体使用

    这篇文章主要介绍了C# 元组和值元组的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Graphics.DrawImage绘制的图像变大的原因分析及解决

    Graphics.DrawImage绘制的图像变大的原因分析及解决

    这篇文章主要介绍了Graphics.DrawImage绘制的图像变大的原因分析及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • C#中的命名空间详解(Namespace)

    C#中的命名空间详解(Namespace)

    文章介绍了命名空间在C#编程中的作用,包括命名空间的定义与使用、using关键字的使用以及嵌套命名空间的实现,通过这些机制,开发者可以有效地组织和隔离代码,避免命名冲突,提高代码的可读性和可维护性
    2024-12-12

最新评论