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()
构造出来就放在容器里面,就可以用了
注册类型,解析实例两个基本功能使用就完成了
浙公网安备 33010602011771号