.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
*/
}
}
}
运行结果:


浙公网安备 33010602011771号