.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
             */
        }
    }
}

  

 

運行結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章