C#在 .NET中使用依赖注入的示例详解

 更新时间:2024年01月10日 08:37:07   作者:rjcql  
这篇文章主要为大家详细介绍了C#如何在 .NET中使用依赖注入,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下

写在前面

在 .NET 中使用依赖注入 (DI)。 可以借助 Microsoft 扩展,通过添加服务并在 IServiceCollection 中配置这些服务来管理 DI。 使用 IHost 接口来公开所有 IServiceProvider 实例,用来充当所有已注册的服务的容器。

示例代码中使用了一个关键的枚举 ServiceLifetime 指定 IServiceCollection 中服务的生存期,该枚举包含三个类型:

Scoped 服务只会随着新范围而改变,但在一个范围中是相同的实例。

Singleton 服务总是相同的,新实例仅被创建一次。

Transient 服务总是不同的,每次检索服务时,都会创建一个新实例。

需要从NuGet安装  Microsoft.Extensions.Hosting 类库

代码实现

服务接口实现

using Microsoft.Extensions.DependencyInjection;
 
namespace ConsoleDI.Example;
 
public interface IReportServiceLifetime
{
    Guid Id { get; }
 
    ServiceLifetime Lifetime { get; }
}
 
// 创建了多个接口和相应的实现。 其中每个服务都唯一标识并与 ServiceLifetime 配对
public interface IExampleTransientService : IReportServiceLifetime
{
    ServiceLifetime IReportServiceLifetime.Lifetime => ServiceLifetime.Transient;
}
 
public interface IExampleScopedService : IReportServiceLifetime
{
    ServiceLifetime IReportServiceLifetime.Lifetime => ServiceLifetime.Scoped;
}
 
public interface IExampleSingletonService : IReportServiceLifetime
{
    ServiceLifetime IReportServiceLifetime.Lifetime => ServiceLifetime.Singleton;
}
 
internal sealed class ExampleTransientService : IExampleTransientService
{
    Guid IReportServiceLifetime.Id { get; } = Guid.NewGuid();
}
 
internal sealed class ExampleScopedService : IExampleScopedService
{
    Guid IReportServiceLifetime.Id { get; } = Guid.NewGuid();
}
 
internal sealed class ExampleSingletonService : IExampleSingletonService
{
    Guid IReportServiceLifetime.Id { get; } = Guid.NewGuid();
}

示例代码

namespace ConsoleDI.Example;
 
internal sealed class ServiceLifetimeReporter(
    IExampleTransientService transientService,
    IExampleScopedService scopedService,
    IExampleSingletonService singletonService)
{
    public void ReportServiceLifetimeDetails(string lifetimeDetails)
    {
        Console.WriteLine(lifetimeDetails);
 
        LogService(transientService, "每次都是新建的对象,一直保持不同");
        LogService(scopedService, "在函数域范围内只创建一次,不同函数内为不同对象");
        LogService(singletonService, "全局单例,一直是同一个");
    }
 
    private static void LogService<T>(T service, string message)
        where T : IReportServiceLifetime =>
        Console.WriteLine($"    {typeof(T).Name}: {service.Id} ({message})");
}

调用示例

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

相关文章

  • C#中out与ref作用区别示例分析

    C#中out与ref作用区别示例分析

    这篇文章主要为大家介绍了C#中out与ref作用区别示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • c#遍历System.drawing.Color下面的所有颜色以及名称以查看

    c#遍历System.drawing.Color下面的所有颜色以及名称以查看

    c#遍历System.drawing.Color下面的所有颜色以及名称以查看,需要的朋友可以参考一下
    2013-02-02
  • c# 引用类型和值类型

    c# 引用类型和值类型

    CLR支持两种类型:引用类型和值类型。引用类型总是从托管堆上分配的
    2012-10-10
  • C#对Task中的异常进行捕获的几种常见方法

    C#对Task中的异常进行捕获的几种常见方法

    在C#中异步Task是一个很方便的语法,经常用在处理异步,例如需要下载等待等方法中,不用函数跳转,代码阅读性大大提高,深受大家喜欢,但是有时候发现我们的异步函数可能出现了报错,本文给大家介绍了C#对Task中的异常进行捕获的几种常见方法,需要的朋友可以参考下
    2025-01-01
  • WinForm实现同时让两个窗体有激活效果的特效实例

    WinForm实现同时让两个窗体有激活效果的特效实例

    这篇文章主要介绍了WinForm实现同时让两个窗体有激活效果的特效实例,基于windows api实现一个窗体激活的时候给另外一个发消息的特效,在进行C#项目开发时有一定的实用价值,需要的朋友可以参考下
    2014-09-09
  • C#利用Free Spire.XLS for .NET复制Excel工作表

    C#利用Free Spire.XLS for .NET复制Excel工作表

    在日常的 .NET 开发中,我们经常需要操作 Excel 文件,本文将详细介绍C#如何使用Free Spire.XLS for .NET 在同一工作簿内或不同工作簿之间复制工作表,有需要的可以了解下
    2025-09-09
  • 使用递归实现数组求和示例分享

    使用递归实现数组求和示例分享

    这篇文章主要介绍了使用递归实现数组求和示例,思路是给定一个含有n个元素的整型数组a,求a中所有元素的和,需要的朋友可以参考下
    2014-03-03
  • C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法

    C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法

    这篇文章主要介绍了C#、.Net中把字符串(String)格式转换为DateTime类型的三种方法,本文总结了Convert.ToDateTime(string)、Convert.ToDateTime(string, IFormatProvider)、DateTime.ParseExact()三种方法,需要的朋友可以参考下
    2015-07-07
  • 使用VS2010 C#开发ActiveX控件(上)

    使用VS2010 C#开发ActiveX控件(上)

    最近做读卡器的B/S应用程序开发,由于读卡器厂商提供的手册都是C/S版本的,而且只有一个原始的Dll包,并没有web版的,那么就只好自己动手,丰衣足食了
    2011-05-05
  • C#中创建统一API接口的实现方案

    C#中创建统一API接口的实现方案

    在 C# 中创建统一 API 接口需要从架构设计、技术选型和代码实现等多个层面进行规划,本文给大家详细介绍了实现方案和完整示例代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2025-04-04

最新评论