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依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .net使用cap实现消息异步处理

    .net使用cap实现消息异步处理

    CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点,本文给大家介绍了.net下使用cap实现消息异步处理,需要的朋友可以参考下
    2024-05-05
  • c#判断正确的ip地址格式示例

    c#判断正确的ip地址格式示例

    这篇文章主要介绍了c#判断正确的ip地址格式示例,需要的朋友可以参考下
    2014-02-02
  • C#实现的最短路径分析

    C#实现的最短路径分析

    C#实现的最短路径分析,需要的朋友可以参考一下
    2013-03-03
  • 深入理解C# 委托与事件

    深入理解C# 委托与事件

    本文主要介绍了深入理解C# 委托与事件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2008-05-05
  • WinForm窗体调用WCF服务窗体卡死问题

    WinForm窗体调用WCF服务窗体卡死问题

    在Winform窗体中调用部署在其他服务器中的WCF服务时,由于调用服务需要一定时延,因此窗体在这段时间一直卡住不能进行其他操作
    2012-12-12
  • C#命令行编译器配置方法

    C#命令行编译器配置方法

    这篇文章主要介绍了C#命令行编译器配置方法,本文讲解了配置C#命令行编译器、配置其它.NET命令行工具、通过csc命令行编译器来编译C#文件实例等内容,需要的朋友可以参考下
    2015-06-06
  • 在C#程序中对MessageBox进行定位的方法

    在C#程序中对MessageBox进行定位的方法

    这篇文章主要介绍了在C#程序中对MessageBox进行定位的方法,针对图形化界面进行调试,需要的朋友可以参考下
    2015-07-07
  • DevExpress中GridControl列转义的实现方法

    DevExpress中GridControl列转义的实现方法

    这篇文章主要介绍了DevExpress中GridControl列转义的实现方法,在项目开发中有一定的实用价值,需要的朋友可以参考下
    2014-08-08
  • C#实现将像素转换为页面单位的方法

    C#实现将像素转换为页面单位的方法

    这篇文章主要介绍了C#实现将像素转换为页面单位的方法,涉及C#像素转换在图形绘制中的技巧,需要的朋友可以参考下
    2015-06-06
  • C# 添加对System.Configuration.dll文件的引用操作

    C# 添加对System.Configuration.dll文件的引用操作

    这篇文章主要介绍了C# 添加对System.Configuration.dll文件的引用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论