.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


相关文章
|
12天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
34 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
40 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
20天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
25天前
|
机器学习/深度学习 存储 人工智能
【AI系统】Tensor Core 架构演进
自2017年Volta架构推出以来,英伟达的GPU架构不断进化,从Volta的张量核心(Tensor Core)革新,到Turing的整数格式支持,再到Ampere的稀疏矩阵计算优化,以及Hopper的FP8张量核心和Transformer引擎,直至2024年的Blackwell架构,实现了30倍的LLM推理性能提升。每一代架构都标志着深度学习计算的重大突破,为AI技术的发展提供了强大的硬件支持。
41 1
|
1月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
24 3
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
111 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
103 0