.netcore中的依赖注入
IOC、DI相关概念的理解
1、依赖:简单的讲就是“引用到”。例如AccountController.cs引用到IAccountService.cs,那么AccountController依赖IAccountService。

2、依赖倒置:依赖倒置是指程序要依赖于抽象或者接口,不要依赖于具体实现(高层模块不依赖于底层模块,不依赖于具体实现,而应该依赖接口)。是六大设置原则之一。它的优势在于当高层模块变化时,底层模块无需改动,达到解耦的目的。
3、反转控制(IOC):是一种设计思想,相对于“正转控制”;所谓的“正转控制”是指类内部自行创建其依赖的类。而反转控制则是谁调用谁创建。例如类A依赖类B,那么不应该A自己创建B,而是应该由A的调用者C创建B给A使用。
4、依赖注入(DI):其实就是IOC思想的实践。就是依赖的注入。依赖注入的方式:1、构造函数注入,2、属性注入、3、方法注入
5、IOC容器:无论是反转控制还是“正转控制”,都免不了创建对象,只是改变了创建对象的时机和传递。为了优化这种对象的创建,引入了IOC容器,它相当于对象的工厂,我们只需要注册(绑定)服务与市里的关系,在需要使用时,容器自动帮我们创建,并维护对象的生命周期(创建销毁)
.netcore的依赖注入
.netcore依赖注入的实现是在Microsoft.Extensions.DependencyInjection这个程序集中。
IServiceCollection 负责注册
IServiceProvider 负责提供实例
容器中获取的实例的生命周期分为三种:
1、Transient: 每一次GetService都会创建一个新的实例(瞬时的)
2、Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)(一次请求过程)
3、Singleton :整个应用程序生命周期以内只创建一个实例(单例的)
简要代码说明
/// <summary>
/// 注册容器
/// </summary>
public void RegisterService()
{
IServiceCollection services = new ServiceCollection();
services.AddScoped<IUserManagement, UserManagement>(); //注入会话范围的
services.AddSingleton<IShippingService, CustomerShippingService>(); //注入单例 services.AddTransient<IBaseMongoRepository<EmailAccount>, EmailAccountRepository>(); //注入瞬时的,每次从service中获取都是新的一个对象
serviceProvider = services.BuildServiceProvider(); }
/// <summary>
/// 从容器中获取对象执行
/// </summary>
public void UseService()
{
var userManagement = serviceProvider.GetService<IUserManagement>();
var user = userManagement.GetCurrentUser();
}
上面的代码仅仅是说明.netcore中的依赖注入容器的注册和对象获取。在WebApi项目或者web项目中,我们基本上是不需要编写从容器中获取对象来执行的,一般都是直接在controller的构造函数中声明依赖的服务接口,在startup类中注入服务。在Controller被初始化时,.netcore自动帮我们完成了注入,很方便使用。
.netcore中的依赖注入的更多相关文章
- ASP.NETCore使用AutoFac依赖注入
原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...
- ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入
原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- ASP.NET Core 在 JSON 文件中配置依赖注入
前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...
- 在.NET Core控制台程序中使用依赖注入
之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
随机推荐
- 00 what is C Programming?C编程是什么?
C语言简介 C is a programming language that lets us give a computer very specifio commands. C语言是一种编程语言,它让 ...
- NMOS和PMOS区别
在很多电路途中会出现NMOS和PMOS管,因为不是中文那么直接,都说管压降之类的,但其实它的导通很重要以及区别,关系到你点亮电子元件> 参考: 1.https://blog.csdn.net/l ...
- JavaScript DOM三种创建元素的方式
三种创建元素的方式: document.write() element.innerHTML document.createElement() 初始HTML内容: <button>btn&l ...
- ASP。使用依赖注入的asp.net Core 2.0用户角色库动态菜单管理
下载source code - 2.2 MB 介绍 在开始这篇文章之前,请阅读我的前一篇文章: 开始使用ASP.NET Core 2.0身份和角色管理 在上一篇文章中,我们详细讨论了如何使用ASP.N ...
- win10 home安装docker快速攻略
本文适用于win10 Home用户,专业版和企业版直接见官网.win7版本见Docker Toolbox. 安装清单 软件 说明 Docker Desktop Installer 步骤介绍页:http ...
- boost之multiprecision
multiprecision boost中提供的高精度库,支持高精度整型,浮点型等.并且提供统一的接口模板,只需要指定对应的后端类型即可实现对应类型的高精度计算: boost::multiprecis ...
- BUUCTF-misc九连环 详解
这个没什么玄学,我们解压出来一张照片,放到hxd中搂一眼,最后结尾的那几行中看到了zip压缩包的结尾标识符,难道这里面还有压缩包,于是我们就formostlrb 果然有图片有压缩包 我们打开压缩包看到 ...
- XUEXI0.4
1.堆是一种内存管理方式,堆和栈是没有关联的.由于内存的容量很大,并且内存需求在时间和空间上没有规律,所以对操作系统来说,管理内存是非常复杂的. 2.堆这种内存管理方式特点是自由.堆内存是由操作系统划 ...
- linux(centos8):基于java13安装rocketmq-4.7.1(解决jdk不兼容的报错)
一,Rocketmq是什么? 1, RocketMQ是一个队列模型的消息中间件,具有高性能.高可靠.高实时.分布式特点 相比kafka,rocketmq的实时性更强 2,官方网站: http://ro ...
- centos8上使用crond
一,查看crond的状态: [root@yjweb crontab]# systemctl status crond 说明:和其他service的执行相同: 启动:systemctl start cr ...