我个人比较懒,能自动做的事绝不手动做,最近在用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依赖注入相关推荐

  1. ASP.NET Core依赖注入最佳实践,提示技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

  2. ASP.NET Core依赖注入深入讨论

    这篇文章我们来深入探讨ASP.NET Core.MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中. 依赖注入是ASP.NET Core的核心,它能让您应用程序中的组件增强 ...

  3. ASP.NET Core依赖注入容器中的动态服务注册

    介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...

  4. ASP.NET Core 依赖注入-集成 Autofac

    概述 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术. 默认服务容器是 Microsoft.Extensions.De ...

  5. 【ASP.NET Core】ASP.NET Core 依赖注入

    一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...

  6. 一文读懂Asp.net core 依赖注入(Dependency injection)

    一.什么是依赖注入 首先在Asp.net core中是支持依赖注入软件设计模式,或者说依赖注入是asp.net core的核心: 依赖注入(DI)和控制反转(IOC)基本是一个意思,因为说起来谁都离不 ...

  7. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  8. core控制器属性注入的用处_了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  9. ASP.NET Core依赖注入初识与思考

    一.前言 在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的.这其中,我们明白了,「控制反转(IoC)」 是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而具体的实现 ...

最新文章

  1. tf.keras.layers.Dense() 示例
  2. vscode 逗号不换行_在VSCode里面配置Vim正确姿势(细节解析)
  3. 全国计算机等级二级证书foxbase,2002年4月全国计算机等级考试二级FOXBASE笔试试题...
  4. 【Web】让你的web页面滚动更有趣
  5. java 实现气泡 源码分析_冒泡排序算法原理及JAVA实现代码
  6. 使用XFire+Spring构建Web Service(一)——helloWorld篇
  7. 蓝桥杯之貌似化学(g背包)
  8. 搭建Mock Server
  9. Linux命令替换字符串
  10. 利用jsonp实现跨域请求
  11. SQL Server 2008 报表服务入门
  12. ubuntu 14.04 下搭建SVN服务器 svn://
  13. 单片微机计算机原理与接口技术高峰,单片微机原理与接口技术(第2版)
  14. 《鸟哥 Linux 私房菜:基础版》阅读笔记
  15. 内行人看笑话 外行人一脸懵逼
  16. matlab 颜色半透明,使用matlab画半透明椭圆
  17. Flask 学习-22.可插拨视图MethodView类
  18. 爱普生荣膺第十届制博会机器人类唯一奖项
  19. C++入门经典-例6.23-字符串数组赋值与string
  20. Windows PowerShell™ 用户手册

热门文章

  1. 剑指offer-面试题13.在O(1)时间删除链表节点
  2. Linux运维实战之DNS的高级配置(转发器、视图等)
  3. url地址传参中文乱码处理
  4. 新装机器如何修改IP地址
  5. 在 ASP.NET 中实现会话状态的基础
  6. .NET6之MiniAPI(四):配置
  7. PowerToys插件扩展(类似Alfred)
  8. 保护我方Id | ASP.NET Core Web API使用加密Id
  9. 微结构设计能力看国产CPU发展
  10. NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?