ASP.Net Core开发(踩坑)指南

  ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET <a href="/3d0e41c95865420f587b3416032419ff.html">MVCa>应用迁移到ASP.NET Core及其异同简介,但没有进行深入的分析和介绍,在真正使用ASP.NET Core进行开发时,如果忽略这些细节可能会出现奇怪的问题,特此将这些细节进行分享。
  本文主要内容有:

  注:本文基于ASP.Net Core 2.1版本,.Net Core SDK版本需要2.1.401+。长篇预警( ╯□╰ )

无处不在的依赖注入

  ASP.NET与ASP.NET Core之间最大区别之一就是内置了依赖注入机制,虽然ASP.NET中也有DI机制,但没有内置容器,一般都需要使用第三方的容器来提供服务,另外依赖注入的概念也不像ASP.NET Core中这样无处不在。
  简单来说依赖注入的目的是为了让代码解耦以提高代码的可维护性,同时也要求代码设计符合依赖导致原则使得代码更加灵活,而其原理实际上就是在应用程序中添加一个对象容器,在应用初始化时将实际的服务“放”到容器中,然后当需要相应服务时从容器中获取,由容器来组装服务。

服务的注册

  ASP.NET Core的Startup(注:Startup仅仅只是约定名称,实际使用是在Program类型中创建 WebHost时使用的),该类型中包含两个方法分别是ConfigureServices和Configure,其中ConfigureServices的主要作用就是用来将服务“放”置到容器中

  

ASP.Net Core开发(踩坑)指南

  代码来自:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

替换默认的依赖注入容器

  ASP.NET Core的默认容器仅提供了构造注入功能,如果需要使用属性注入等功能或者在迁移时原有应用依赖于其它容器,那么可以通过使用第三方容器实现。
  将默认容器替换为其它容器仅需三步:
  1. 将ConfigureServices方法的返回类型改为IServiceProvider。
  2. 将ASP.NET Core中的服务注册到第三方容器中。
  3. 使用第三方容器实现IServiceProvider接口并返回。

  官方文档以Autofac为例,Autofac已经实现了ASP.NET Core服务注册到Autofac容器中,以及Autofac容器的IServiceProvider接口封装,仅需安装Autofac以及Autofac.Extensions.DependencyInjection包即可。

  

ASP.Net Core开发(踩坑)指南

  详情参考:
  使用windsor或其它容器可以参考:
  https://stackoverflow.com/questions/47672614/how-to-use-windsor-ioc-in-asp-net-core-2

将Controller注册为服务

  虽然Controller在激活时是通过容器来获取Controller的依赖(即构造方法需要的参数),在代码运行的时候给人一种Controller是从容器中组装的错觉,但是实际上默认情况下Controller的组装过程不是直接由容器组装的,如果要让Controller从容器组装,那么在配置MVC服务时需要通过.AddControllerAsServices()方法将Controller注册到容器中:

  

ASP.Net Core开发(踩坑)指南

  注:一般情况下是否将Controller注册为服务对Controller的开发和代码的运行并没有很大区别,但是如果当容器变更为其它容器,并且使用了容器提供的如属性注入等功能时,如果没有将Controller注册为服务,那么相应的属性注入的过程也不会被触发,简单来说就是只有将Controller注册为服务,那么实例化Controller的工作才会由容器完成,才会触发或者使用到容器提供的其它特性。

服务的获取

  前面介绍了服务的注册,现在来介绍一下在ASP.NET Core中有哪些方法可以获取服务:
  1. Controller构造方法参数。
  2. 通过Controller注入IServiceProvider类型,通过IServiceProvider来获取服务:

  

ASP.Net Core开发(踩坑)指南

  3. 在Action方法或者Mvc过滤器(过滤器的上下文参数中包含HttpContext)中通过HttpContext的RequestServices对象获取服务:

  

ASP.Net Core开发(踩坑)指南

  4. 在View上通过@inject注入服务:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpszyp.html