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();
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!