.NetCore2.1項目升級到.NetCore3.1的一點記錄

前言

最近將近半個月沒有更新博客了,由於找到了新的工做,開始上班了。上班之餘也沒閒着,上週末將本身去年的一個.NetCore2.1的框架升級到了3.1版本。在升級過程當中仍是出現了很多問題。有些是版本升級必需要解決的,有些是由於本身犯了強迫症,必定要將引用的Nuget包升級到當前最新版本。 這裏就憑藉記憶,記錄下此次升級的點點滴滴吧。html

框架引用的Nuget包

這裏先將引用到的部分Nuget包羅列出來,都是經常使用的庫。跨域

  • Autofac
  • AutoMapper
  • NewLife.Redis
  • NLog
  • System.Text.Json
  • Microsoft.AspNet.SignalR
  • DotNetCore.NPOI
  • Quartz
  • Swashbuckle.AspNetCore

升級到.NetCore 3.1出現的幾個明顯的問題

  • 使用第三方IOC容器方式的改變致使依賴注入這一塊代碼須要改動
  • Startup內提供內置的依賴注入服務有所改變,致使原有的部分方法編譯可經過運行時則異常
  • 跨域實現部分微軟作了更細化的限制,原有的跨域部分代碼運行時異常

依賴的組件出現的問題

  • AutoMapper升級到9.0後由於官方移除了靜態API致使全部引用到AutoMapper映射的地方都要改,同時須要將IMapper注入到DI容器內
  • Swashbuckle.AspNetCore升級到5.1後API有所更新,須要從新編寫部分代碼,同時由於新增了一些特性能夠將之前自定義的部分擴展刪除

上面基本上是本次升級中碰到的一些問題,看上去感受很好處理但是在實際代碼中未必如此。一步一步說~緩存

替換微軟原生IOC容器致使的代碼變動app

首先看下原來的IOC容器是如何替換的框架

 

 

 

如上圖的ConfigureServices方法,該方法的簽名是返回一個IServiceProvider接口,你能夠粗略的把它當成一個IOC服務。
上面的關鍵代碼是 return services.AddAutofacService(); 它將一個已經Build後的IContainer容器對象轉成ILifetimeScope
對象返回給ConfigureServices方法。ide

具體代碼以下圖:ui

 

 

 

其中RegisterDependencyService的職責是將指定的程序集動態注入到Autofac容器中,同時Build出容器。須要注意的是Autofac的ContainerBuilder對象在Build出IContainer
容器後是不容許再次經過該對象執行Update以及Build方法。
RegisterDependencyService代碼以下圖spa

 

 

 

須要留意RegisterDependencyService上面的AutoMapper的映射注入,後面升級AutoMapper後這一段代碼會整改~
這就是原來.NetCore2.1的依賴注入以及微軟原生依賴注入容器替換成Autofac的關鍵代碼。
那麼個人.NetCore 3.1版本的代碼如何改變的?
首先看下3.1下面Startup下的ConfigureServices方法改爲啥樣了。
以下圖:code

ConfigureServices 方法簽名再也不有IServiceProvider 返回值,那若是須要更改原生的依賴注入容器要怎麼作?系統採起相似提供一個回調方法,
在此方法內咱們使用第三方依賴注入容器對服務進行註冊,並且只須要註冊,容器不須要你進行Build~
以下圖,在Startup下新增以下方法htm

同時採起Autofac的ModuleRegistrationExtensions擴展類對服務進行註冊,要求必須建立一個繼承Autofac.Module的「模塊」類,
在該模塊類裏執行全部的注入工做。模塊類裏面經過重寫Load方法實現服務註冊,以下圖

 

 

 

這裏要講下AutoMapper在升級到9.0後將靜態API都移除了,做者的意圖也很明顯,他認爲開發者應遵循微軟倡導的依賴注入方式去使用具體的服務,
因此沒有辦法,IMapper也得老老實實的進行服務注入,不然後續沒得玩。
AutoMapper注入以下:

 

 

 

反射程序集找到全部映射Profile,而後注入映射了Profile的MapperConfiguration對象。再注入MapperConfiguration對象建立的IMapper對象。
至此解決了Autofac以及AutoMapper~

緩存問題

接下來就是緩存了,緩存其實主要是配置上的,如.NetCore2.1配置下我是這麼配置的:

 

 

 

一樣的代碼在升級到3.1版本後運行時會出現下面異常:

The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time. Configure the CORS policy by listing individual origins if credentials needs to be supported.

如何解決能夠參考:
https://mykkon.work/how-to-setup-any-origin/

 Swagger的相關變化

swager的改變有下面幾點

移除了文件上傳操做過濾器(新版本的Swagger已經支持包含文件上傳的Aciton,不須要和之前同樣繼承IOperationFilter)
如之前是這麼作的,建立一個繼承IOperationFilter的過濾器

4c67a602e97d8b556c4dd1e91ba79923.png
在AddSwaggerGen方法內引用它。

還有就是增長Swagger的認證和之前有所不一樣,參考

https://www.cnblogs.com/choii/p/12484544.html

相關文章
相關標籤/搜索