编辑
2025-09-24
C#
00

目录

摘要
正文

摘要

C# 是一种广泛使用的编程语言,具有丰富的特性和广泛的应用场景。其中,依赖注入(DI)是一种非常重要的软件设计模式,它可以将类及其依赖项的控制权反转,使得程序的可扩展性和灵活性得到了极大的提升。在 .NET 世界中,依赖注入、IConfiguration、ILogger 和 Option 模式被视为一等公民,成为了广泛使用的设计模式。

正文

nuget安装

Microsoft.Extensions.DependencyInjection;

Microsoft.Extensions.Configuration

Microsoft.Extensions.Logging

Microsoft.Extensions.Configuration.Json

Microsoft.Extensions.Logging.Console

写一个简单配制文件application.json

C#
{ "server": "127.0.0.1", "user": "sa", "password": "123" }

写一个DIConfig类

C#
public class DIConfig { public static IServiceProvider ConfigureServices() { var serviceCollection = new ServiceCollection(); var configuration = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("application.json",true) .Build(); serviceCollection.AddSingleton(configuration); serviceCollection.AddLogging(loggingBuilder => { loggingBuilder.AddConsole(); }); Register(serviceCollection, configuration); return serviceCollection.BuildServiceProvider(); } //注册 private static void Register(IServiceCollection services, IConfiguration configuration) { services.AddSingleton<IWriter,MessageWriter>(); services.AddSingleton(typeof(Message<>)); services.AddSingleton<Email>(); services.AddSingleton(sp => { var user = configuration.GetSection("user").Value; return new Func<string>(() => { return user; }); }); }

这里Func注入,其实就是注入一个需返回的委托做为初使化,可以像一个工厂的作用。

IWriter接口

C#
public interface IWriter { public void Write(string value); }

MessageWriter,继承IWriter接口,其中添加了一个Logger

C#
public class MessageWriter: IWriter { private readonly ILogger<MessageWriter> logger; public MessageWriter(ILogger<MessageWriter> logger) { this.logger = logger; } public void Write(string msg) { logger.LogInformation(msg); } }

Email 类

C#
public class Email { private readonly IWriter _writer; private readonly Func<string> _func; public Email(IWriter writer,Func<string> func) { _writer = writer; _func = func; } public void Send() { var ret = _func(); _writer.Write("from email..."); } }

Message类

C#
public class Message<T> { private readonly ILogger<Message<T>> logger; private readonly IWriter writer; public Message(ILogger<Message<T>> logger, IWriter writer) { this.logger = logger; this.writer = writer; } public void Send() { writer.Write("message t writer..."); logger.LogInformation("message"); } }

调用

C#
static void Main(string[] args) { var sp = DIConfig.ConfigureServices(); var msg = sp.GetService<Email>(); msg.Send(); var msg1= sp.GetService<Message<String>>(); msg1.Send(); }

image.png

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!