02_04_依赖注入基本用法

依赖注入系统是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()

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

 

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

 

posted on 2026-01-26 13:37  张彦山  阅读(2)  评论(0)    收藏  举报