实现BUG自动检测 - ASP.NET Core依赖注入
我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评。
如果以后有时间的话,我打算写一个系列的【实现BUG自动检测】,本文将是第一篇。
如果你使用过ASP.NET Core那么对依赖注入一定不陌生。
使用流程为:
1. 先注册Service,有3个方法AddTransient、AddScoped、AddSingleton
2. 再使用Service,通常在构造方法里声明
先来说说产生BUG的场景
BUG场景一:
有的时候可能因为疏忽忘记注册Service直接就使用了,使用那个Service时会报异常。这种情况项目都是可以编译通过的,是一个不太容易发现的BUG,如果那个Service在测试时没有覆盖到这个BUG就会被带到生产环境
BUG场景二:
通常有一些Service我们只希望它在请求作用域内被使用,例如:在服务端持有数据库连接的Service通常都是请求作用域级别的,即:在请求内第一次使用数据库时创建数据库连接,请求内会复用连接,请求结束回收连接。
对应ASP.NET Core里的注册方式如下:
services.AddScoped<IDbContext, DbContext>();
在ASP.NET Core中AddScoped注册的Service在请求结束时会销毁。
如果你在控制器中直接引用IDbContext一切正常,现在业务需要我们要封装一个用户管理类UserManager,它是单例的,注册代码:
services.AddScoped<IUserManager, UserManager>();
在写UserManager类的时候要访问数据库,顺手就引用了IDbContext(正常是不应该这么引用的但是忘记了),因为UserManager是单例会造成IDbContext永远不会释放,进而长期占用一个数据库连接。并且在编译时,运行时都不会报错,很隐蔽的一个BUG
好了,场景说完了,本文的主角该登场了,解决方式如下:
在Startup类的ConfigureServices方法最后加入如下代码:
public
void
ConfigureServices(IServiceCollection services){
//此处省略若干代码...
//确保服务依赖的正确性,放到所有注册服务代码后调用
if
(_env.IsDevelopment())
services.AssertDependencyValid();
}
对于“场景一”此方法会抛出异常:
throw new InvalidProgramException($"服务 {svceType.FullName} 的构造方法引用了未注册的服务 {paramType.FullName}");
对于“场景二”此方法会抛出异常:
throw new InvalidProgramException($"Singleton的服务 {svceType.FullName} 的构造方法引用了Scoped的服务 {paramType.FullName}");
您可以根据异常的提示找到具体有问题的类并修改之
完整代码如下:
原文地址:http://www.cnblogs.com/mondol/p/6271300.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
实现BUG自动检测 - ASP.NET Core依赖注入相关推荐
- ASP.NET Core依赖注入最佳实践,提示技巧
分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...
- ASP.NET Core依赖注入深入讨论
这篇文章我们来深入探讨ASP.NET Core.MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中. 依赖注入是ASP.NET Core的核心,它能让您应用程序中的组件增强 ...
- ASP.NET Core依赖注入容器中的动态服务注册
介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...
- ASP.NET Core 依赖注入-集成 Autofac
概述 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术. 默认服务容器是 Microsoft.Extensions.De ...
- 【ASP.NET Core】ASP.NET Core 依赖注入
一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...
- 一文读懂Asp.net core 依赖注入(Dependency injection)
一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...
- 全面理解 ASP.NET Core 依赖注入
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- core控制器属性注入的用处_了解ASP.NET Core 依赖注入,看这篇就够了
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- ASP.NET Core依赖注入初识与思考
一.前言 在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的.这其中,我们明白了,「控制反转(IoC)」 是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而具体的实现 ...
最新文章
- tf.keras.layers.Dense() 示例
- vscode 逗号不换行_在VSCode里面配置Vim正确姿势(细节解析)
- 全国计算机等级二级证书foxbase,2002年4月全国计算机等级考试二级FOXBASE笔试试题...
- 【Web】让你的web页面滚动更有趣
- java 实现气泡 源码分析_冒泡排序算法原理及JAVA实现代码
- 使用XFire+Spring构建Web Service(一)——helloWorld篇
- 蓝桥杯之貌似化学(g背包)
- 搭建Mock Server
- Linux命令替换字符串
- 利用jsonp实现跨域请求
- SQL Server 2008 报表服务入门
- ubuntu 14.04 下搭建SVN服务器 svn://
- 单片微机计算机原理与接口技术高峰,单片微机原理与接口技术(第2版)
- 《鸟哥 Linux 私房菜:基础版》阅读笔记
- 内行人看笑话 外行人一脸懵逼
- matlab 颜色半透明,使用matlab画半透明椭圆
- Flask 学习-22.可插拨视图MethodView类
- 爱普生荣膺第十届制博会机器人类唯一奖项
- C++入门经典-例6.23-字符串数组赋值与string
- Windows PowerShell™ 用户手册
热门文章
- 剑指offer-面试题13.在O(1)时间删除链表节点
- Linux运维实战之DNS的高级配置(转发器、视图等)
- url地址传参中文乱码处理
- 新装机器如何修改IP地址
- 在 ASP.NET 中实现会话状态的基础
- .NET6之MiniAPI(四):配置
- PowerToys插件扩展(类似Alfred)
- 保护我方Id | ASP.NET Core Web API使用加密Id
- 微结构设计能力看国产CPU发展
- NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?