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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 过来提前占个楼 感谢,下载保存了 很好很强大我过来先占个楼 待编辑 懂技术并乐意极积无私分享的人越来越少。珍惜 收藏一下 不知道什么时候能用到 yyds。多谢分享 这个好,看起来很实用 东西不错很实用谢谢分享 谢谢分享,辛苦了 收藏一下 不知道什么时候能用到 这个有用。 过来提前占个楼 过来提前占个楼 这个好,看起来很实用 不错,里面软件多更新就更好了 感谢发布原创作品,程序园因你更精彩 鼓励转贴优秀软件安全工具和文档! 新版吗?好像是停更了吧。 谢谢分享,辛苦了
页:
[1]
2