.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中从被 ...
随机推荐
- Linux中断驱动程序
1.中断概念 中断时一种电信号,由硬件设备产生,然后再由中断控制器向处理器发送相应的信号.处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断.此后,处理器会通知操作系统已经产生中断. ...
- .NET 5.0 RC2 发布,正式版即将在 11 月 .NET Conf 大会上发布
原文:http://dwz.win/ThX 作者:Richard 翻译:精致码农-王亮 说明:本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句. 今天(10月13日)我们发布了 .NET 5. ...
- MeteoInfoLab脚本示例:闪电位置图
这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...
- Spring Aop 详解一
Aop 是一个编程思想,最初是一个理论,最后落地成了很多的技术实现. 我们写一个系统,都希望尽量少写点儿重复的东西.而很多时候呢,又不得不写一些重复的东西.比如访问某些方法的权限,执行某些方法性能的日 ...
- ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南
ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南 首先安装g++ sudo apt install g++ 检查是否安装成功: 在插件栏安装插件c/c++.code runner: ...
- 连肝三个通宵,JVM77道高频面试题详细分析,就这?
为方便大家记忆,记得收藏加关注哦 ,需要下载PDF版本请在公众号[程序员空间]回复"资料"即可获取下载方式,你也可以 点在文末微信扫描二维码关注! 1.java 中会存在内存泄漏吗 ...
- WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构.该架构的项层为服务模型层. 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型. ...
- django—视图相关
FBV与CBV FBV:function based view 基于函数的视图 CBV:class based view 基于类的视图 CBV的定义: from django.views imp ...
- SSM中 web.xml配置文件
<!--核心监听器 当tomcat(web容器,应用服务器,web服务器)启动的时候创建spring 工厂类对象,绑定到tomcat上下文中 --> <listener> &l ...
- OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体
前言 级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类. Demo 可以猜测,1其实是人,18序号类是狗 ...