惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
G
Google Developers Blog
B
Blog RSS Feed
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 司徒正美
D
Docker
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
H
Help Net Security
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
博客园 - Franky
人人都是产品经理
人人都是产品经理
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Blog — PlanetScale
Blog — PlanetScale
L
LangChain Blog

博客园 - wuty007

我让AI帮忙做了一个“全国产品质量鉴定法规监测”Skill WPF + OpenCvSharp 实现摄像头、RTSP 人脸与动物检测跟踪 TelegramConsole C# 范围运算符 C# 调用WGC 实现桌面屏幕的捕获 完善基于WPF开发的标尺控件(含实例代码) C# 获取Windows系统的设备名称 记录 Windows系统开启hyper-v ,部分端口被保留,导致端口不能使用而报错的问题 WPF 调用 Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口 记录WPF 在清单列表设置了UIACESS为true,没有签名的报错“从服务器返回了一个参照” WPF 的ListBox 去除默认的Item项的 鼠标hover的背景颜色 WPF 调用 ChangeWindowMessageFilterEx 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离 记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 记录 使用PsExec启动System权限的WPF 程序 记录 命令行的 findstr 的使用 排查Windows 下的内存使用率过高,但是任务管理器看不到进程 Everything 支持 多实例 运行 指定应用 在 控制面板或者 设置的安装应用 置灰或隐藏卸载按钮 WPF 通过RawInput 获取 系统全局触摸事件 C# 定时任务 Quartz.NET 的使用 记录一下Windows系统下的命令行参数的字符个数限制 WPF 实现支持动态调整高度的文本显示控件
C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现...
wuty007 · 2026-01-02 · via 博客园 - wuty007

一、前言

还记得之前做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();

执行的结果:

image

结论:

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

  • 在 IntelliSense 中显示,无需更多 using 指令。
  • 减少usingProgram类中通常调用这些扩展方法所需的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