最近將近半個月沒有更新博客了,由於找到了新的工做,開始上班了。上班之餘也沒閒着,上週末將本身去年的一個.NetCore2.1的框架升級到了3.1版本。在升級過程當中仍是出現了很多問題。有些是版本升級必需要解決的,有些是由於本身犯了強迫症,必定要將引用的Nuget包升級到當前最新版本。 這裏就憑藉記憶,記錄下此次升級的點點滴滴吧。html
這裏先將引用到的部分Nuget包羅列出來,都是經常使用的庫。跨域
上面基本上是本次升級中碰到的一些問題,看上去感受很好處理但是在實際代碼中未必如此。一步一步說~緩存
替換微軟原生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/
swager的改變有下面幾點
移除了文件上傳操做過濾器(新版本的Swagger已經支持包含文件上傳的Aciton,不須要和之前同樣繼承IOperationFilter)
如之前是這麼作的,建立一個繼承IOperationFilter的過濾器
在AddSwaggerGen方法內引用它。
還有就是增長Swagger的認證和之前有所不一樣,參考