.net 依赖注入使用的是构造函数注入方式,并且具有传染性。
比如有一个控制器中使用了日志和存储两个类,而存储中使用了日志类和配置类,则都只需要在其构造函数中写需要的类,然后在容器中注册,就可以直接使用。
日志类代码
// 日志接口
public interface ILog
{
public void Log(string message);
}
// 实现了日志接口的日志类
public class LogImpl : ILog
{
public void Log(string message)
{
Console.WriteLine($"日志:{message}");
}
}
配置类代码
// 配置接口
interface IConfig
{
public string GetValue(string key);
}
// 配置类
class ConfigImpl : IConfig
{
public string GetValue(string key)
{
return "值是:"+ key;
}
}
存储类代码
// 存储接口
interface IStorage
{
public void Save(string content,string name);
}
// 存储类
class StorageImpl : IStorage
{
private readonly IConfig config;
// 通过依赖注入IConfig
public StorageImpl(IConfig c)
{
this.config = c;
}
public void Save(string content, string name)
{
string server = config.GetValue("server");
Console.WriteLine($"向服务器{server}的文件名为{name}上传");
}
}
控制器类代码
// 控制器
class Controller
{
private readonly ILog _log;
private readonly IStorage _storage;
// 通过依赖注入Ilog和IStorage
public Controller(ILog log,IStorage storage)
{
this._log = log;
this._storage = storage;
}
public void Test()
{
this._log.Log("开始上传");
this._storage.Save("","1.txt");
this._log.Log("上传完成");
}
}
调用代码
ServiceCollection services = new ServiceCollection();
// 注册控制器
services.AddScoped<Controller>();
// 通过日志接口注册日志类
services.AddScoped<ILog,LogImpl>();
// 通过云存储接口注册云存储类
services.AddScoped<IStorage,StorageImpl>();
// 通过配置接口注册接口类
services.AddScoped<IConfig,ConfigImpl>();
using (ServiceProvider sp = services.BuildServiceProvider())
{
// 获取控制器
Controller controller = sp.GetService<Controller>();
// 使用控制器
controller.Test();
}
标签:依赖,string,接口,传染性,public,services,日志,net,log
From: https://www.cnblogs.com/sunhouzi/p/17859802.html