.NET 7 使用自带容器实现依赖注入

需安装nuget包:Microsoft.Extensions.Hosting 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
 
namespace ConsoleAppDI;
 
public class Program
{
    static void Main(string[] args)
    {
        /*
        // .NET 提供了一个内置的服务容器 IServiceProvider
        var builder = Host.CreateApplicationBuilder(args);
        builder.Services.AddHostedService<Worker>();
        //builder.Services.AddSingleton<IMessageWriter, MessageWriter>();
        builder.Services.AddSingleton<IMessageWriter, LoggingMessageWriter>();
 
 
        using var host = builder.Build();
        host.Run();
        */
 
        // 第二种DI容器构建方法!
        var host = Host
            .CreateDefaultBuilder(args)
            .ConfigureServices(services =>
            {
                services.AddHostedService<Worker>();
                services.AddSingleton<IMessageWriter, LoggingMessageWriter>();
            }).Build();
 
        host.Run();
    }
}
 
/// <summary>
/// 在依赖项注入术语中,服务:通常是向其他对象提供服务的对象,如 IMessageWriter 服务。
/// </summary>
public interface IMessageWriter
{
    public void Write(string message);
}
/// <summary>
/// MessageWriter 是服务实现!
/// </summary>
public class MessageWriter : IMessageWriter
{
    public void Write(string message)
    {
        Console.WriteLine($"{message}");
    }
}
public class LoggingMessageWriter : IMessageWriter
{
    private readonly ILogger<LoggingMessageWriter> _logger;
    public LoggingMessageWriter(ILogger<LoggingMessageWriter> logger)
    {
        _logger = logger;
    }
 
    public void Write(string message)
    {
        _logger.LogInformation($"Info: {message}");
    }
}
 
public class Worker : BackgroundService
{
    private readonly IMessageWriter _messageWriter;
 
    public Worker(IMessageWriter messageWriter)
    {
        _messageWriter = messageWriter;
    }
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _messageWriter.Write($"Worker running at: {DateTimeOffset.Now}");
            await Task.Delay(2_000, stoppingToken);
 
            /*
             * info: ConsoleAppDI.LoggingMessageWriter[0]
             * Info: Worker running at: 2023/8/10 9:25:05 +08:00
             */
        }
    }
}

  

 

运行结果:

 

posted @   海阔天空XM  阅读(102)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示