一、前言
还记得之前做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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |