.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

相关文章
相关标签/搜索