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

推荐订阅源

V
Visual Studio Blog
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
量子位
S
SegmentFault 最新的问题
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Threat Research - Cisco Blogs
I
Intezer
Hugging Face - Blog
Hugging Face - Blog
Spread Privacy
Spread Privacy
Microsoft Security Blog
Microsoft Security Blog
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
Cyberwarzone
Cyberwarzone
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
Jina AI
Jina AI
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
AWS News Blog
AWS News Blog
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
T
Threatpost
大猫的无限游戏
大猫的无限游戏
I
InfoQ
T
Tor Project blog
Project Zero
Project Zero
F
Full Disclosure
L
Lohrmann on Cybersecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
B
Blog
Apple Machine Learning Research
Apple Machine Learning Research
The Hacker News
The Hacker News
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
V2EX
The Cloudflare Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security

博客园 - wuty007

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 实现 控制反转(IOC)
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