找回密码
 立即注册
首页 业界区 安全 C# 依赖注入 Microsoft.Extensions.DependencyInjection ...

C# 依赖注入 Microsoft.Extensions.DependencyInjection 实现 控制反转(IOC)

锟及 昨天 23:05
一、前言

还记得之前做OTA的项目,组内的同事用了autofac 的组件做IOC容器注入业务服务。由于我们的项目都迁移到了.Net8 以上,看了微软自带的IOC容器组件跟autofac的差别不是很大,所以使用一下微软自带的Microsoft.Extensions.DependencyInjection 的组件库。本文记录一下简单的使用方法。
二、使用

创建新的控制台应用程序


  • 创建使用依赖项注入的 .NET 控制台应用
  • 生成和配置 通用主机
  • 编写多个接口和相应的实现
  • 使用服务生存期和 DI 的范围
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <PropertyGroup>
  3.     <OutputType>Exe</OutputType>
  4.     <TargetFramework>net8.0</TargetFramework>
  5.     <ImplicitUsings>enable</ImplicitUsings>
  6.     <Nullable>enable</Nullable>
  7.   </PropertyGroup>
  8.   <ItemGroup>
  9.     <PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.1" />
  10.   </ItemGroup>
  11. </Project>
复制代码
添加接口
  1.   public interface IMessage
  2.   {
  3.       void Message(string message);
  4.   }
复制代码
添加实现
  1.     public class WutyMessage : IMessage
  2.     {
  3.         public void Message(string message)
  4.         {
  5.             Console.WriteLine($"{nameof(WutyMessage)}Write:{message}");
  6.         }
  7.     }
复制代码
添加执行调用类(添加需要DI的服务)
  1.   /// <summary>
  2.   /// 测试调用中间件微服务
  3.   /// </summary>
  4.   public class TestExcuter
  5.   {
  6.       private IMessage _message;
  7.       public TestExcuter(IMessage message)
  8.       {
  9.          this._message = message;
  10.          Console.WriteLine("构造函数获取到了message参数");
  11.       }
  12.       public void Excuter()
  13.       {
  14.           _message.Message($"TestExcuter 执行了IMessage的方法了,{DateTime.Now}");
  15.           Console.WriteLine($"TestExcuter 执行完毕!");
  16.       }
  17.   }
复制代码
注册 DI 的服务
  1. // See https://aka.ms/new-console-template for more information
  2. using Microsoft.Extensions.Hosting;
  3. using System.ComponentModel;
  4. using DiDemo;
  5. using Microsoft.Extensions.DependencyInjection;
  6. Console.WriteLine("Hello, World!");
  7. HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
  8. builder.Services.AddTransient<TestExcuter>();
  9. builder.Services.Add(ServiceDescriptor.Transient<IMessage,WutyMessage>());
  10. using IHost host = builder.Build();
  11. ExemplifyServiceExcuter(host.Services);
  12. host.Run();
  13. //执行调用
  14. static void ExemplifyServiceExcuter(IServiceProvider hostProvider)
  15. {
  16.     using IServiceScope serviceScope = hostProvider.CreateScope();
  17.     IServiceProvider provider = serviceScope.ServiceProvider;
  18.     //获取注册的服务
  19.     TestExcuter testExcuter = provider.GetRequiredService<TestExcuter>();
  20.     testExcuter.Excuter();
  21.     Console.WriteLine();
  22. }
  23. Console.ReadKey();
复制代码
执行的结果:

 
1.png

结论:

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
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册