.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


相关文章
|
1月前
|
存储 开发框架 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`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
93 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
57 0
|
3月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
115 0
|
6天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
5天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
5天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
16 1
服务架构的演进:从单体到微服务的探索之旅