锟及 发表于 2026-1-2 23:05:09

C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC)

一、前言

还记得之前做OTA的项目,组内的同事用了autofac 的组件做IOC容器注入业务服务。由于我们的项目都迁移到了.Net8 以上,看了微软自带的IOC容器组件跟autofac的差别不是很大,所以使用一下微软自带的Microsoft.Extensions.DependencyInjection 的组件库。本文记录一下简单的使用方法。
二、使用

创建新的控制台应用程序


[*]创建使用依赖项注入的 .NET 控制台应用
[*]生成和配置 通用主机
[*]编写多个接口和相应的实现
[*]使用服务生存期和 DI 的范围
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
</ItemGroup>



</Project>添加接口

public interface IMessage
{
      void Message(string message);
}添加实现

    public class WutyMessage : IMessage
    {
      public void Message(string message)
      {
            Console.WriteLine($"{nameof(WutyMessage)}Write:{message}");
      }
    }添加执行调用类(添加需要DI的服务)

/// <summary>
/// 测试调用中间件微服务
/// </summary>
public class TestExcuter
{
      private IMessage _message;
      public TestExcuter(IMessage message)
      {

         this._message = message;
         Console.WriteLine("构造函数获取到了message参数");
      }

      public void Excuter()
      {
          _message.Message($"TestExcuter 执行了IMessage的方法了,{DateTime.Now}");
          Console.WriteLine($"TestExcuter 执行完毕!");
      }

}注册 DI 的服务

// See https://aka.ms/new-console-template for more information

using Microsoft.Extensions.Hosting;
using System.ComponentModel;
using DiDemo;
using Microsoft.Extensions.DependencyInjection;


Console.WriteLine("Hello, World!");

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);


builder.Services.AddTransient<TestExcuter>();

builder.Services.Add(ServiceDescriptor.Transient<IMessage,WutyMessage>());
using IHost host = builder.Build();

ExemplifyServiceExcuter(host.Services);

host.Run();

//执行调用
static void ExemplifyServiceExcuter(IServiceProvider hostProvider)
{
    using IServiceScope serviceScope = hostProvider.CreateScope();
    IServiceProvider provider = serviceScope.ServiceProvider;

    //获取注册的服务
    TestExcuter testExcuter = provider.GetRequiredService<TestExcuter>();
    testExcuter.Excuter();
    Console.WriteLine();
}

Console.ReadKey();执行的结果:

 

结论:

1、每个 services.Add{LIFETIME} 扩展方法都会添加(并可能配置)服务。 我们建议应用遵循此约定。 除非要创作官方Microsoft包,否则不要在 Microsoft.Extensions.DependencyInjection 命名空间中放置扩展方法。 命名空间中 Microsoft.Extensions.DependencyInjection 定义的扩展方法:

[*]在 IntelliSense 中显示,无需更多 using 指令。
[*]减少using或Program类中通常调用这些扩展方法所需的Startup指令数。
2、应用:

[*]IHostApplicationBuilder使用主机生成器设置创建实例。
[*]配置服务,将它们与对应的服务生命周期一起添加。
[*]调用 Build() 并分配一个 IHost 实例。
[*]调用ExemplifyServiceLifetime,传入IHost.Services。
[*]

[*]Transient 服务始终不同。 每次检索服务时都会创建一个新实例。
[*]Scoped 服务仅随新范围更改,但在范围内是同一实例。
[*]Singleton 服务始终相同。 仅创建一次新实例。

三、参考资料

1、使用依赖关系注入 - .NET | Microsoft Learn
2、依赖关系注入 - .NET | Microsoft Learn
3、WPF 依赖注入 Microsoft.Extensions.DependencyInjection .NET - 超级无敌美少男战士 - 博客园
 
Demo链接:wutyDemo/DiDemo at main · wutangyuan/wutyDemo
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

柴古香 发表于 2026-1-10 14:50:58

过来提前占个楼

陆菊 发表于 2026-1-14 10:21:14

感谢,下载保存了

粉押淫 发表于 2026-1-18 19:33:17

很好很强大我过来先占个楼 待编辑

寇油 发表于 2026-1-19 10:54:58

懂技术并乐意极积无私分享的人越来越少。珍惜

揿纰潦 发表于 2026-1-21 00:53:50

收藏一下   不知道什么时候能用到

勉欤铅 发表于 2026-1-21 13:58:05

yyds。多谢分享

别萧玉 发表于 2026-1-22 17:16:10

这个好,看起来很实用

晌集涟 发表于 2026-1-25 11:55:04

东西不错很实用谢谢分享

赏勿 发表于 2026-1-28 05:01:03

谢谢分享,辛苦了

喳谍 发表于 2026-1-28 08:08:37

收藏一下   不知道什么时候能用到

郗新语 发表于 2026-1-28 09:02:39

这个有用。

接快背 发表于 2026-1-30 06:55:48

过来提前占个楼

钦娅芬 发表于 2026-2-1 05:37:16

过来提前占个楼

谷江雪 发表于 2026-2-3 06:56:31

这个好,看起来很实用

莠畅缕 发表于 2026-2-5 08:07:18

不错,里面软件多更新就更好了

泠邸 发表于 2026-2-6 06:06:45

感谢发布原创作品,程序园因你更精彩

虾氲叱 发表于 2026-2-6 08:32:29

鼓励转贴优秀软件安全工具和文档!

蛟当罟 发表于 2026-2-7 21:03:39

新版吗?好像是停更了吧。

庾签 发表于 2026-2-7 23:04:47

谢谢分享,辛苦了
页: [1] 2
查看完整版本: C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC)