Microsoft.Extensions.DependencyInjection依赖注入
为什么要使用依赖注入
轻松管理类之间的依赖,构建应用时遵循设计原则。确保代码的可维护性和可扩展性。
依赖注入提供了对象创建和生命周期管理的核心能力
具体运用的组件:
接口实现分离模式,抽象包只需要声明,具体包包括具体的实现。意味着我们的组件只需要依赖它的抽象接口,不需要依赖实现。当使用时注入它的具体实现即可。
好处:以后可以任务修改具体实现的内容,不需要更改代码里面的引用逻辑代码。
依赖注入的核心类型
IserviceCollection:负责服务的注册
ServiceDescriptor:每个服务注册时的信息
IserviceProvider:具体的容器,也是由servicecollection build出来的
IserviceScope:表示一个容器的子容器的生命周期
######生命周期 是由IserviceScope继承的
#######单例singleton:整个生命周期都是一致的
#######作用域 scoped:容器的生存周期内是一致的,二次请求会更新
#######瞬间 Transient:每次从容器获取对象时都是一个全新的对象
测试声明周期 附代码
先创建不同的生命周期的三个接口和三个类
namespace HostWebDetail
{
//声明三个接口 测试生命周期 分别为单例,作用域,瞬间
public interface IMySingletonService
{
}
public interface IMyScopedService
{
}
public interface IMyTransientService
{
}
//声明方法 继承接口
public class MySingletonService: IMySingletonService
{
}
public class MyScopedService: IMyScopedService
{
}
public class MyTransientService: IMyTransientService
{
}
}
然后在startup中依赖注入
public void ConfigureServices(IServiceCollection services)
{
#region 注册服务不同生命周期的服务
services.AddSingleton<IMySingletonService, MySingletonService>();
services.AddScoped<IMyScopedService, MyScopedService>();
services.AddTransient<IMyTransientService, MyTransientService>();
#endregion
}
然后在控制器中实现
[Route("ServiceLifetime")]
[HttpGet]
//FromServices从容器里获取我们的对象
//每个对象输出两次 对比它的变化
public List<string> GetServiceLifetime(
[FromServices] IMySingletonService singleton1,
[FromServices] IMySingletonService singleton2,
[FromServices] IMyScopedService scoped1,
[FromServices] IMyScopedService scoped2,
[FromServices] IMyTransientService transient1,
[FromServices] IMyTransientService transient2)
{
var s = new List<string>();
s.Add($"singleton1:{singleton1.GetHashCode()}");
s.Add($"singleton2:{singleton2.GetHashCode()}");
s.Add($"scoped1:{scoped1.GetHashCode()}");
s.Add($"scoped2:{scoped2.GetHashCode()}");
s.Add($"transient1:{transient1.GetHashCode()}");
s.Add($"transient2:{transient2.GetHashCode()}");
return s;
}
执行效果
依赖注入的二种方式:构造函数和formservice
1构造函数:适用于大部分方法都需要该方法的情况下 2 FromService 适用于具体某个接口使用时
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!