吉林省网站建设_网站建设公司_一站式建站_seo优化
2026/1/2 22:28:13 网站建设 项目流程

一、前言

还记得之前做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 informationusing 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 - 超级无敌美少男战士 - 博客园

 

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询