惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
H
Help Net Security
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
博客园 - 叶小钗
Y
Y Combinator Blog
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
C
Check Point Blog
Recent Announcements
Recent Announcements
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
B
Blog

博客园 - 张彦山

03_03_依赖注入多种方式 03_02_服务注册与消费 03_01_服务作用域 02_05_生命周期管理 02_03_依赖注入与控制反转 1_05_详解.NET标准与重要工具 1_04_盘点.NET重要组件 1_03_详解.NET公共语言运行时 1_02_解读.NET开源许可协议 1-01梳理.NET平台发展路线 SQLServer存储过程中break、continue及return 三者的区别: SqlDBX格式化sql语句输出 Mysql转存sql结构和数据文件,不包含视图,使用结构同步视图 启用防火墙要配置入站规则redis端口6379或程序 清除SQL Server数据库日志(ldf文件) 阿里云服务器sqlserver暴力登录密码攻击的处理 清除远程桌面缓存命令 sqlserver修改表结构,阻止保存要求重新创建表的更改 从旧表复制数据到新表
02_04_依赖注入基本用法
张彦山 · 2026-01-26 · via 博客园 - 张彦山

依赖注入系统是asp.netcore框架提供的

普通控制台的项目使用的SDK是<Project Sdk="Microsoft.NET.Sdk">

Microsoft.NET.Sdk是不包含asp.netcore框架的,运行时也是分开的

Web开发,子集Microsoft.NET.Sdk.Web,包含了asp.netcore下的所有组件,也包含了依赖注入系统组件

代码

使用的是ServiceCollection,继承了接口IServiceCollection,集合IList<ServiceDescriptor>

称之为服务集合,在集合里面注册,进一步创造出服务容器.BuildServiceProvider()

2、生命周期

 管理服务实例 ,决定了创建出来的服务实例可以存活多久,有效期

怎么指定?

注册的时候就指定有效期,后面就根据指定的生命周期创建

 不同的方法名设置不同的生命周期

1、瞬时 AddTransient

2、作用域 AddScoped

3、单例 AddSingleton

            var provider = new ServiceCollection()
                .AddTransient<IAccount, Account>()
                .AddScoped<IMessage, Message>()
                .AddSingleton<ITool, Tool>()
                .BuildServiceProvider(); 

冰箱创建好了,里面的每一个食物都有个有效期

最基本的获取对象

provider.GetService<IAccount>()

一个抽象类注册了多个具体类,后面的会覆盖前面的

如果要获取全部的接口 使用

.GetServices<Base>().ToList();获取到抽象类的集合
public abstract class Base
{
    protected Base()
    {
        Console.WriteLine($"{GetType().Name} 已创建");
    }
}

public class Account:Base, IAccount{}
public class Message:Base, IMessage{}
public class Tool:Base, ITool{}

public static void Run()
{
    var services = new ServiceCollection()
        .AddTransient<Base, Account>()
        .AddTransient<Base, Message>()
        .AddTransient<Base, Tool>()
        .BuildServiceProvider()
        .GetServices<Base>().ToList();

    Debug.Assert(services.OfType<Account>().Any());
    Debug.Assert(services.OfType<Message>().Any());
    Debug.Assert(services.OfType<Tool>().Any());
}

Base抽象类也可以作为服务,不一定是接口,实现类写在后面,具体的子类

services.OfType<Tool>().Any()

构造出来就放在容器里面,就可以用了

注册类型,解析实例两个基本功能使用就完成了