.net 依赖注入“传染性”

.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();
}
posted @ 2023-11-27 17:02  Simian_2018_12_22  阅读(29)  评论(0编辑  收藏  举报