实现BUG自动检测 - ASP.NET Core依赖注入
我個人比較懶,能自動做的事絕不手動做,最近在用ASP.NET Core寫一個項目,過程中會積累一些方便的工具類或框架,分享出來歡迎大家點評。
如果以后有時間的話,我打算寫一個系列的【實現(xiàn)BUG自動檢測】,本文將是第一篇。
如果你使用過ASP.NET Core那么對依賴注入一定不陌生。
使用流程為:
1. 先注冊Service,有3個方法AddTransient、AddScoped、AddSingleton
2. 再使用Service,通常在構(gòu)造方法里聲明
?
先來說說產(chǎn)生BUG的場景
BUG場景一:
有的時候可能因為疏忽忘記注冊Service直接就使用了,使用那個Service時會報異常。這種情況項目都是可以編譯通過的,是一個不太容易發(fā)現(xiàn)的BUG,如果那個Service在測試時沒有覆蓋到這個BUG就會被帶到生產(chǎn)環(huán)境
BUG場景二:
通常有一些Service我們只希望它在請求作用域內(nèi)被使用,例如:在服務(wù)端持有數(shù)據(jù)庫連接的Service通常都是請求作用域級別的,即:在請求內(nèi)第一次使用數(shù)據(jù)庫時創(chuàng)建數(shù)據(jù)庫連接,請求內(nèi)會復(fù)用連接,請求結(jié)束回收連接。
對應(yīng)ASP.NET Core里的注冊方式如下:
services.AddScoped<IDbContext, DbContext>();
在ASP.NET Core中AddScoped注冊的Service在請求結(jié)束時會銷毀。
如果你在控制器中直接引用IDbContext一切正常,現(xiàn)在業(yè)務(wù)需要我們要封裝一個用戶管理類UserManager,它是單例的,注冊代碼:
services.AddScoped<IUserManager, UserManager>();
在寫UserManager類的時候要訪問數(shù)據(jù)庫,順手就引用了IDbContext(正常是不應(yīng)該這么引用的但是忘記了),因為UserManager是單例會造成IDbContext永遠不會釋放,進而長期占用一個數(shù)據(jù)庫連接。并且在編譯時,運行時都不會報錯,很隱蔽的一個BUG
好了,場景說完了,本文的主角該登場了,解決方式如下:
在Startup類的ConfigureServices方法最后加入如下代碼:
對于“場景一”此方法會拋出異常:
throw new InvalidProgramException($"服務(wù) {svceType.FullName} 的構(gòu)造方法引用了未注冊的服務(wù) {paramType.FullName}");
對于“場景二”此方法會拋出異常:
throw new InvalidProgramException($"Singleton的服務(wù) {svceType.FullName} 的構(gòu)造方法引用了Scoped的服務(wù) {paramType.FullName}");
您可以根據(jù)異常的提示找到具體有問題的類并修改之
完整代碼如下:
原文地址:http://www.cnblogs.com/mondol/p/6271300.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的实现BUG自动检测 - ASP.NET Core依赖注入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软Project Springfiel
- 下一篇: 左耳朵耗子:不灌鸡汤,说真的年龄渐长,技