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

需安装nuget包:Microsoft.Extensions.Hosting 

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 @ 2023-08-10 09:53  海阔天空XM  阅读(112)  评论(0)    收藏  举报