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


前言

最近將近半個月沒有更新博客了,因為找到了新的工作,開始上班了。上班之余也沒閑着,上周末將自己去年的一個.NetCore2.1的框架升級到了3.1版本。在升級過程中還是出現了不少問題。有些是版本升級必須要解決的,有些是因為自己犯了強迫症,一定要將引用的Nuget包升級到當前最新版本。 這里就憑借記憶,記錄下這次升級的點點滴滴吧。

框架引用的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容器導致的代碼變更

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

 

 

 

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

具體代碼如下圖:

 

 

 

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

 

 

 

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

ConfigureServices 方法簽名不再有IServiceProvider 返回值,那如果需要更改原生的依賴注入容器要怎么做?系統采取類似提供一個回調方法,
在此方法內我們使用第三方依賴注入容器對服務進行注冊,而且只需要注冊,容器不需要你進行Build~
如下圖,在Startup下新增如下方法

同時采取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

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM