首页 > 其他分享 >.net 依赖注入“传染性”

.net 依赖注入“传染性”

时间:2023-11-27 17:14:17浏览次数:40  
标签:依赖 string 接口 传染性 public services 日志 net log

.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

相关文章

  • .net 控制反转(IoC)和依赖注入(DI)
    引言控制反转(IoC)实现方法:(隐式)依赖注入:需要什么服务(类),直接在类里面写,然后系统在创建类的时候给服务(类)自动赋值。(显式)服务定位器:需要什么服务(类)在给服务定位器要什么服务(类)1.初始化使用引用包:Microsoft.Extensions.DependencyInjection首先需要创建一个容器:ServiceCollec......
  • 转:在.NET FX 4.8项目中使用C# 8/9/10的新语法
    在.NETFX4.8项目中使用C#8/9/10的新语法吴冬wdhustInnovativeBIMtechniques 受到某些特殊原因的限制,有时候.NET项目被锁死在.NETFramework4.8,而无法升级到.NET5等更高版本,导致代码中能够使用的C#语法最高只能支持到C#7.3,而无法使用C#8及更高版......
  • 构建卓越Kubernetes安全之路:最佳实践与军规
    Kubernetes作为现代云原生计算的中流砥柱,其安全性是我们构建稳健应用生态的首要任务。在这篇博文中,我们将探讨构建卓越Kubernetes安全的道路,通过最佳实践和制定安全军规,确保您的集群免受威胁。1. 了解威胁与风险在开始构建安全之旅之前,深入了解可能的威胁和风险是关键一步。考虑容......
  • 快速入门:使用 Azure CLI 部署 Azure Kubernetes 服务 (AKS) 群集
    原文:https://learn.microsoft.com/zh-cn/azure/aks/learn/quick-kubernetes-deploy-cli本文内容开始之前创建资源组创建AKS群集连接到群集显示另外4个AzureKubernetes服务(AKS)是可用于快速部署和管理群集的托管式Kubernetes服务。在本快速入门中,请执行以下操......
  • Kubernetes全面指南:从入门到精通
    Kubernetes,简称K8s,作为云原生时代的领军者,已经成为容器编排和管理的事实标准。无论您是初学者还是有经验的开发者,本篇博文将带您深入了解Kubernetes,从基础概念到高级技术,逐步引领您进入这个强大的开源平台的世界。第一部分:初识Kubernetes1.1什么是Kubernetes?Kubernetes是一个开源......
  • 2023 合肥站 热身赛 B Problem F. Flower’s Land 换根dp 依赖背包
    传送门。求出包含某个点连通块大小为K的权值和最大值。钦定1为根节点,只求根节点的答案,其实是一个依赖性01背包问题可以\(nk\)的时间内解决。考虑进行换根操作,由于背包是取max的背包没办法进行背包的删除,然而取前后缀背包背包的合并为\(k^2\)复杂度过高。当时还有一个想法是点......
  • Netty 源码分析
    ServerBootstrap主要介绍服务端的启动流程以及如何绑定端口号、开启服务端Socket并让其进入接收连接状态的启动模板如下;try{ChannelFuturefuture=newServerBootstrap().group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)......
  • .net core 6 由数据库生成对应实体类
    首先按照网上其他朋友的教程,安装对应程序包 然后在程序包管理器控制台中执行Scaffold-DbContext,总是报错,各种各样的错误,说未引用的程序包之类的。最后找到的解决办法是,在vs的菜单栏中找到视图--终端,然后在下方弹出的“开发者PowerShell”中输入命令 dotnetefdbcontexts......
  • Sb7:关于.net使用WCF过程中遇到的坑
    最近写了一个类似QQ升级的功能。使用wcf编写了一个服务端。 做了四个接口服务,可以根据软件编号查询所有版本号,可以根据版本查询所有待升级文件,远程获取升级文件。在做服务的时候原计划GetFile方法中采用异步同时传输,将大文件切割成多个模块进行传输,在客户端接收完后重新组包再......
  • .NET8 极致性能优化 Non-GC Heap
    前言.NET8里面JIT引入了一个新的机制,叫做Non-GCHeap。JIT可以确保相关对象分配在Non-GCHeap上,该堆像其名称一样,不受GC管理。JIT需要保证这个对象没有被GC引用,并且在这个对象的生命周期内一直是根对象(不会被GC消灭的对象)的状态。原文:.NET8极致性能优化Non-......