.NET Core-依赖注入:良好架构的起点

简介: .NET Core-依赖注入:良好架构的起点

为何需要依赖注入框架?

  • 借助依赖注入框架,可轻松管理类之间的依赖,便于遵循设计原则,确保代码的可维护性和可扩展性
  • ASP.NET Core的整个架构中,依赖注入框架提供了对象创建和生命周期管理的核心能力,各个组件相互协作,也是由依赖注入框架的能力来实现的。

依赖注入的组件包

包括2个,一个是抽象包,一个是具体实现包,符合接口实现分离原则,便于调用

  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.DependencyInjection

核心类型

依赖注入框架包括以下的4个核心类型,并负责不同的分工

类型 内容
IServiceCollection 负责服务的注册
IServiceDescriptor 服务注册信息描述
IServiceProvider 具体的容器,由IServiceCollection创建
IServiceScope 表示容器的子容器的生命周期

 

生命周期

生命周期有3种,分别为Singleton、Scoped、Transient

Singleton 整个根容器内都是单例
Scoped 在当前容器的生命周期内是单例的
Transient 每次获取对象都是全新对象

服务的注册方式

在容器内注册服务可以有以下几种注册方式

正常注册

services.AddSingleton<IMySingletonService, MySingletonService>();
services.AddScoped<IMyScopedService, MyScopedService>();
services.AddTransient<IMYTransientService, MyTransientService>();

花式注册(包含实例注入、工厂模式)

//直接注入实例
services.AddSingleton<IOrderService>(new OrderService());
//工厂注册
services.AddSingleton<IOrderService>(factory =>
{
    return new OrderServiceEx();
});//可以注入,实现不同

尝试注册

尝试注册分为2种,一种是TryAdd...形式,一种是TryAddEnumerable形式,区别是

TryAdd...形式只能注册同一类型的一个服务,即使实现不同也不能注入

TryAddEnumerable可注册相同类型的不同实现

//TryAdd...,相同类型的不会重复注入
services.TryAddSingleton<IOrderService, OrderService>();//不会注入,相同类型的都不会注入
services.TryAddSingleton<IOrderService, OrderServiceEx>();//不会注入,相同类型的都不会注入
//TryAddIEnumerable,可以注入不同实现
//services.TryAddEnumerable(services.AddSingleton<IOrderService, OrderService>());//注入报错,System.ArgumentException
services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService, OrderServiceEx>());//可以注入
//注入报错,System.ArgumentException
//services.TryAddEnumerable(ServiceDescriptor.Singleton<IOrderService>(factory =>
//{
//    return new OrderServiceEx();
//}));

由以上代码,我们可以看出,尝试注入相同的实现,会抛System.ArgumentException异常。

替换和移除

出去服务的注册,我们还需要了解服务的替换和移除方式,服务的替换有助于我们抛弃他人的定义来使用自己的定义

services.Replace(ServiceDescriptor.Singleton<IOrderService, OrderServiceEx>());//经测试,这里只能替换非尝试注册的服务
services.Remove(ServiceDescriptor.Singleton<IOrderService, OrderService>());
//services.RemoveAt(0);
//services.RemoveAll<IOrderService>();

这里,我经过代码测试,发现,服务替换只能替换非尝试注册的方式,而尝试注册的方式不受影响,这里要注意一下,虽然还不知道原理是什么。这里是错误结论,replace方法是移除第一个同类型的服务,并添加当前的服务,而不是全部替换。

泛型注册

其实,不管是什么类型,注册方式都是类似的,常规注入方式需要提供2个类型,分别是接口定义和接口实现,那么一个泛型类型的定义可如下

services.AddSingleton(typeof(IGenericServie<>),typeof(GenericService<>));

获取依赖注入实例的2种方式

获取依赖注入实例有2种方式,且对应于不同的使用场景

构造函数注入 适用于controller中大部分服务都需要用到的情况
[FromService]标签

适用于服务仅有某个接口使用的情况

[FromService]可从容器中获取服务对象。

示例如下:

构造函数注入

public WeatherForecastController(ILogger<WeatherForecastController> logger,IOrderService orderService,IGenericServie<IOrderService> genericServie)
{
    _logger = logger;
}

[FromService]获取

[HttpGet]
public int GetServiceList([FromServices] IEnumerable<IOrderService> orderServices)
{
    foreach (var item in orderServices)
    {
        Console.WriteLine($"{item.GetType()}-{item.GetHashCode()}");
    }
    return 1;
}

 

到这里,本节就要结束了,下一节学习作用于与对象的释放行为。

源码可访问

https://github.com/IronMarmot/Samples/tree/master/CoreSamples


相关文章
|
4月前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
95 5
|
3月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
86 26
|
4月前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
108 1
|
5月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
98 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
4月前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
97 3
|
5月前
|
机器学习/深度学习 存储 人工智能
【AI系统】Tensor Core 架构演进
自2017年Volta架构推出以来,英伟达的GPU架构不断进化,从Volta的张量核心(Tensor Core)革新,到Turing的整数格式支持,再到Ampere的稀疏矩阵计算优化,以及Hopper的FP8张量核心和Transformer引擎,直至2024年的Blackwell架构,实现了30倍的LLM推理性能提升。每一代架构都标志着深度学习计算的重大突破,为AI技术的发展提供了强大的硬件支持。
160 1
|
5月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
68 3
|
6月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
110 0
|
4月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
114 5
|
7月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
121 7
下一篇
oss创建bucket