在讨论.Net的依赖注入(DI)之前,我们需要知道我们为什么需要使用依赖注入

依赖反转原理(DIP):

DIP允许您将两个类解耦,否则它们会紧密耦合,这有助于提高可重用性和更好的可维护性

DIP介绍:

  1. 高级模块不应依赖于低级模块。两者都应依赖抽象。
  2. 抽象不应依赖细节。细节应取决于抽象。

下面我们通过一个示例来探讨前者

class Foo {
Foo(Car _car){
//dosomething
}
}

在上面的代码中,类Foo直接依赖于Car,当这两个类严重依赖时会导致两个问题

  1. Foo不能用不同的样式实例化car,即如果有新的汽车类型,例如:Audi来了,Foo则不能重复使用
  2. 每次修改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中使用,而无需复杂的配置。

服务注册的三种类型:

  1. Transient:需要时创建新实例
  2. Scoped:可以为每个新作用域创建一个新实例
  3. Singleton:第一个请求上创建一个新实例,并且在应用程序的剩余生命周期中,将相同的实例提供给所有使用者类。

推荐做法:

  1. 范围服务通常应由单个Web请求/线程使用。因此,不应该在线程之间共享服务范围。
  2. 配置为单例的服务可能会导致应用程序中的内存泄漏。
  3. 内存泄漏通常是由单例服务引起的。这是因为创建的实例不会被丢弃,它将保留在内存中直到应用程序结束。因此,一旦不使用它们,最好将它们释放。
  4. 将服务注册为临时服务会缩短其使用寿命,通常可能不太在乎多线程和内存泄漏。
  5. 不要在单例服务中依赖瞬态或作用域服务。因为瞬时服务在单例服务注入时成为一个单例实例,并且如果瞬态服务不旨在支持这种情况,则可能导致问题。在这种情况下,ASP.NET Core的默认DI容器已经引发异常。

依赖项注入技术使您可以进一步改进它。它提供了一种将对象的创建与使用分开的方法。这样,您可以在不更改任何代码的情况下替换依赖关系,这还可以减少业务逻辑中的代码。

如有哪里讲得不是很明白或是有错误,欢迎指正

如您喜欢的话不妨点个赞收藏一下吧

.Net核心依赖项注入:生命周期和最佳实践的更多相关文章

  1. 第 6 章 —— 依赖项注入(DI)容器 —— Ninject

    有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...

  2. 在WPF中使用.NET Core 3.0依赖项注入和服务提供程序

    前言 我们都知道.NET Core提供了对依赖项注入的内置支持.我们通常在ASP.NET Core中使用它(从Startup.cs文件中的ConfigureServices方法开始),但是该功能不限于 ...

  3. Spring:所有依赖项注入的类型

    一.前言 Spring文档严格只定义了两种类型的注入:构造函数注入和setter注入.但是,还有更多的方式来注入依赖项,例如字段注入,查找方法注入.下面主要是讲使用Spring框架时可能发生的类型. ...

  4. Spring Framework核心概念之Bean生命周期管理

    目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApp ...

  5. autofac 注入生命周期

    创建实例方法 1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component ...

  6. android核心系列--1,组件生命周期

    一,进程模型及进程托管 1,一个APP应用是由一个或多个组件构成的,这些组件可以运行在一个进程中,也可以分别运行在多个进程中: 进程的构造和销毁是由系统全权负责的. 2,一个应用进程只有一个应用环境对 ...

  7. 建立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 ...

  8. 【译】WebAPI,Autofac,以及生命周期作用域

    说明 原文地址:http://decompile.it/blog/2014/03/13/webapi-autofac-lifetime-scopes/ 介绍 这是一篇关于AutoFac的生命周期作用域 ...

  9. 依赖注入及AOP简述(十一)——生命周期管理 .

    2.     生命周期管理 各种依赖注入框架提供了替开发者管理各种Scope的便利功能,随之而来的就必然是被管理的依赖对象的生命周期管理的问题.所谓生命周期管理,就是一个对象在它所属的Scope中从被 ...

随机推荐

  1. Linux中断驱动程序

    1.中断概念 中断时一种电信号,由硬件设备产生,然后再由中断控制器向处理器发送相应的信号.处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断.此后,处理器会通知操作系统已经产生中断. ...

  2. .NET 5.0 RC2 发布,正式版即将在 11 月 .NET Conf 大会上发布

    原文:http://dwz.win/ThX 作者:Richard 翻译:精致码农-王亮 说明:本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句. 今天(10月13日)我们发布了 .NET 5. ...

  3. MeteoInfoLab脚本示例:闪电位置图

    这个脚本示例读取文本格式的闪电数据,读出每条闪电记录的经纬度和强度,在地图上绘制出每个闪电的位置,并用符号和颜色区分强度正负.数据格式如下:0 2009-06-06 00:01:16.6195722 ...

  4. Spring Aop 详解一

    Aop 是一个编程思想,最初是一个理论,最后落地成了很多的技术实现. 我们写一个系统,都希望尽量少写点儿重复的东西.而很多时候呢,又不得不写一些重复的东西.比如访问某些方法的权限,执行某些方法性能的日 ...

  5. ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南

    ubuntu基于VSCode的C++编程语言的构建调试环境搭建指南 首先安装g++ sudo apt install g++ 检查是否安装成功: 在插件栏安装插件c/c++.code runner: ...

  6. 连肝三个通宵,JVM77道高频面试题详细分析,就这?

    为方便大家记忆,记得收藏加关注哦 ,需要下载PDF版本请在公众号[程序员空间]回复"资料"即可获取下载方式,你也可以 点在文末微信扫描二维码关注! 1.java 中会存在内存泄漏吗 ...

  7. WCF服务创建到发布(SqlServer版)

    在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构.该架构的项层为服务模型层. 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型. ...

  8. django—视图相关

    FBV与CBV FBV:function based view   基于函数的视图 CBV:class based view  基于类的视图 CBV的定义: from django.views imp ...

  9. SSM中 web.xml配置文件

    <!--核心监听器 当tomcat(web容器,应用服务器,web服务器)启动的时候创建spring 工厂类对象,绑定到tomcat上下文中 --> <listener> &l ...

  10. OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体

    前言   级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类.   Demo       可以猜测,1其实是人,18序号类是狗 ...