.Net核心依赖项注入:生命周期和最佳实践

在讨论.Net的依赖注入(DI)之前,我们需要知道我们为什么需要使用依赖注入
依赖反转原理(DIP):
DIP允许您将两个类解耦,否则它们会紧密耦合,这有助于提高可重用性和更好的可维护性
DIP介绍:
- 高级模块不应依赖于低级模块。两者都应依赖抽象。
- 抽象不应依赖细节。细节应取决于抽象。
下面我们通过一个示例来探讨前者
class Foo {
Foo(Car _car){
//dosomething
}
}
在上面的代码中,类Foo直接依赖于Car,当这两个类严重依赖时会导致两个问题
- Foo不能用不同的样式实例化car,即如果有新的汽车类型,例如:Audi来了,Foo则不能重复使用
- 每次修改Car类都会直接影响Foo类
为了避免这两个问题,DIP建议较高级别的模块Foo不应直接依赖于较低级别的模块,Car而应两者都依赖于抽象,例如:接口
class Foo {
Foo(ICar _car){
// something
}
}
class Car : ICar {
}
class Sedan : ICar{
}
只需引入一个简单的抽象ICar,Foo它就可以兼容所有遵循契约或抽象的类ICar。
我们现在如何将当前方法使用依赖注入?
如果您需要修改较低级别的类,DIP可以提高代码的可重用性并限制波动效果。即使完美地实现了DIP,该接口也仅在较高级别的类中解耦了较低级别的类的用法,而不是其实例化。在代码的某些地方,您需要实例化接口的实现。这样可以防止您用另一种动态替换接口的实现。
依赖注入在这里发挥了作用,有助于从实例中区分使用实例。简而言之,只要DI框架在类中看到任何已注册服务的依赖项,它就会提供具体的实例化。
假设ICar已在DI框架中注册以提供的实例Car,则的构造函数将Foo始终Car为每个Foo对象实例接收一个实例
.NET中的DI:
在.NetCore框架之前,我们更多的是使用第三方DI框架,例如Autofac。但是,当.NetCore出现后。“Startup”类提供了一种称为的方法configureServices供我们将服务注册到容器内。
public class Startup
{
public void ConfigureServices(IServiceCollection services) {
//服务注入
services.AddTransient<ICar, Car>();
}
}
因此,对于每个请求,将使用容器中解析的所有依赖项来获取实例。所有这些都可以在.Net core中使用,而无需复杂的配置。
服务注册的三种类型:
- Transient:需要时创建新实例
- Scoped:可以为每个新作用域创建一个新实例
- Singleton:第一个请求上创建一个新实例,并且在应用程序的剩余生命周期中,将相同的实例提供给所有使用者类。
推荐做法:
- 范围服务通常应由单个Web请求/线程使用。因此,不应该在线程之间共享服务范围。
- 配置为单例的服务可能会导致应用程序中的内存泄漏。
- 内存泄漏通常是由单例服务引起的。这是因为创建的实例不会被丢弃,它将保留在内存中直到应用程序结束。因此,一旦不使用它们,最好将它们释放。
- 将服务注册为临时服务会缩短其使用寿命,通常可能不太在乎多线程和内存泄漏。
- 不要在单例服务中依赖瞬态或作用域服务。因为瞬时服务在单例服务注入时成为一个单例实例,并且如果瞬态服务不旨在支持这种情况,则可能导致问题。在这种情况下,ASP.NET Core的默认DI容器已经引发异常。
依赖项注入技术使您可以进一步改进它。它提供了一种将对象的创建与使用分开的方法。这样,您可以在不更改任何代码的情况下替换依赖关系,这还可以减少业务逻辑中的代码。
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
.Net核心依赖项注入:生命周期和最佳实践的更多相关文章
- 第 6 章 —— 依赖项注入(DI)容器 —— Ninject
有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...
- 在WPF中使用.NET Core 3.0依赖项注入和服务提供程序
前言 我们都知道.NET Core提供了对依赖项注入的内置支持.我们通常在ASP.NET Core中使用它(从Startup.cs文件中的ConfigureServices方法开始),但是该功能不限于 ...
- Spring:所有依赖项注入的类型
一.前言 Spring文档严格只定义了两种类型的注入:构造函数注入和setter注入.但是,还有更多的方式来注入依赖项,例如字段注入,查找方法注入.下面主要是讲使用Spring框架时可能发生的类型. ...
- Spring Framework核心概念之Bean生命周期管理
目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...
- autofac 注入生命周期
创建实例方法 1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component ...
- android核心系列--1,组件生命周期
一,进程模型及进程托管 1,一个APP应用是由一个或多个组件构成的,这些组件可以运行在一个进程中,也可以分别运行在多个进程中: 进程的构造和销毁是由系统全权负责的. 2,一个应用进程只有一个应用环境对 ...
- 建立MVC的依赖项注入 Setting up MVC Dependency Injection 精通ASP-NET-MVC-5-弗瑞曼
The result of the three steps I showed you in the previous section is that the knowledge about the i ...
- 【译】WebAPI,Autofac,以及生命周期作用域
说明 原文地址:http://decompile.it/blog/2014/03/13/webapi-autofac-lifetime-scopes/ 介绍 这是一篇关于AutoFac的生命周期作用域 ...
- 依赖注入及AOP简述(十一)——生命周期管理 .
2. 生命周期管理 各种依赖注入框架提供了替开发者管理各种Scope的便利功能,随之而来的就必然是被管理的依赖对象的生命周期管理的问题.所谓生命周期管理,就是一个对象在它所属的Scope中从被 ...
随机推荐
- 多测师讲解python_模块间的调用_高级讲师肖sir
案例1: 在aaa.py 文件A类中定义一个函数sadp: 在bbb.py文件中导入aaa模块,导入类 ,调用函数 案例2: aaa模块中定义一个A类, 在定义一个sadp的函数, 在bbb模块中导 ...
- 佛山6397.7539(薇)xiaojie:佛山哪里有xiaomei
佛山哪里有小姐服务大保健[微信:6397.7539倩儿小妹[佛山叫小姐服务√o服务微信:6397.7539倩儿小妹[佛山叫小姐服务][十微信:6397.7539倩儿小妹][佛山叫小姐包夜服务][十微信 ...
- MeteoInfoLab脚本示例:获取一维数据并绘图
气象数据基本为多维数据(通常是4维,空间3维加时间维),只让数据中一维可变,其它维均固定即可提取一维数据.比如此例中固定了时间维.高度维.纬度维,只保留经度维可变:hgt = f['hgt'][0,[ ...
- excel 无效引用 所引用的单元格不能位于256列
无效引用 该文件版本所包含的公式中,所引用的单元格不能位于256列(列IW 或更远)或 65536 行以外的区域. 原因及解决方法: 1.版本问题,把两文件都另存为一致的版本,改为后缀为xlsx. 2 ...
- C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
循环链表 把链表的两头连接,使其成为了一个环状链表,通常称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,链表就能成环儿,下图所示. 需要注意的是,虽然循环链表成环 ...
- 扫描仪扫描文件处理-ABBYY自动矫正图像歪斜
修改界面语言: 设置为不识别图片文字(因为我们只需要把图片歪斜校正): 保存无损彩色格式:
- 【动态规划】DP搬运工3
UPD:修了点锅(啊昨天居然写脑抽了) 题目内容 给定两个长度为 \(n\) 的序列,定义 \(magic(A,B)=\sum\limits_{i=1}^n \max(A_i,B_i)\). 现在给定 ...
- C# Webservice中如何实现方法重载--(方法名同名时出现的问题)
本文摘抄自:http://blog.sina.com.cn/s/blog_53b720bb0100voh3.html 1.Webservice中的方法重载问题(1)在要重载的WebMethod上打个M ...
- 【多次实践】win10+ubuntu18.04lts双系统安装葵花宝典(安装篇)
这个教程诞生的缘由很简单,吃的太饱,硬是要折腾,结果,这一折腾便是20余小时,故写此文,帮助后来者少走弯路! 在本文开始,请先允许我对网上很多类似的教程嗤之以鼻,很成功地让我走了很多的弯路,一些有效简 ...
- 关于overflow的理解
overflow会把超出父盒子的部分继续不同修改 在这我只执行一个常用属性值 原始代码如下(未设置overflow前): 执行结果: 设置后运行结果: