最近将近半个月没有更新博客了,由于找到了新的工做,开始上班了。上班之余也没闲着,上周末将本身去年的一个.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的认证和之前有所不一样,参考