5. 在Action方法中,通过FormServices特性注入:
注:一般来说尽可能显式的标明类型的依赖(即通过构造参数的方式声明当前类型所依赖的组件),上面的2和3两点分别都是通过服务提供器在方法内部来获取依赖,这样做依赖对于外界来说是不可知的,可能会对代码的可维护、可测试性等造成一定影响,这种模式被称为Service Locator模式,在开发过程中尽可能避免Service Locator模式的使用。
常用的服务 ASP.NET Core相对于ASP.NET来说取消了一些常用的静态类型,比如HttpContext、ConfigurationManager等,取而代之的是通过将类似的组件以服务的形式注册到容器中,使用时通过容易来获取相应的服务组件,这些常用的服务有:
1. IHostingEnvironment:包含了环境名称、应用名称以及当前应用程序所处的根目录及Web静态内容的根目录(默认wwwroot)。
2. IHttpContextAccessor:从名字可以看出,它用来访问当前请求的HttpContext。
3. IConfiguration:ASP.NET Core配置信息对象。
4. IServiceProvider: ASP.NET Core服务提供器。
5. DbContext: 这里的DbContext指的是EFCore的DbContext,在ASP.NET Core中,EFCore的DbContext也是在ConfigureServices方法中进行配置并添加到容器,使用时直接从容器中获取(但要注意的是对于分层结构的开发风格来说,DbContext不会直接被Controller依赖,而是被Controller中依赖的业务服务类型所以来,就是说编写Controller代码的时候不会直接与DbContext发生直接交互)。
在ASP.NET的开发中,通常某个变量需要从配置文件读取,一般都是在相应类型的构造方法中,通过静态类型ConfigurationManager的AppSettings方法来读取并初始化变量。虽然ASP.NET Core也可以在类型中注入IConfiguration实例来直接读取配置文件,但该方法由于Options模式的出现已经不再建议使用,使用组件通过依赖相应的组件Options可以做到关注点分离,提高程序的灵活性、可拓展性,Options使用方法见文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-2.1
ASP.NET Core 请求管道建立ASP.NET由于是基于IIS请求管道的,ASP.NET应用程序仅仅是管道中的一个处理环节,管道中还包含如身份验证、静态文件处理等环节,但ASP.NET Core不一样,它脱离了IIS处理管道,所以整个管道的建立均需要靠程序自身完成,而ASP.NET Core建立管道的代码就是Startup类型的Configure方法,该方法通过IApplicationBuilder实例来添加不同功能的中间件,通过中间件的串联形成处理管道,下图是ASP.NET Mvc模板生成的管道代码:
图片来自:
该管道主要包含了错误处理(开发环境显示异常信息,其它环境跳转错误页面)中间件、静态文件处理中间件以及Mvc中间件。
更多中间件可参考文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/index?view=aspnetcore-2.1
ASP.NET Core Mvc与ASP.NET Mvc相比整体上区别不大,但仍然有很多细节上的变化,下面就开始一一介绍:
路由路由的作用是将请求根据Url映射到“对应”的处理器上,在Mvc中请求的终点就是Controller的Action方法,而这里所谓的“对应”指的是Url与路由模板的匹配,ASP.NET Core Mvc通过以下的方式添加路由模板:
上图中的路由模板是最常用的路由模板,使用花括号内的内容为路由参数及其默认值,Url中通过路由参数控制器名称、活动方法名称来匹配到相应控制器的活动方法。
在注册路由时可以为相应路由添加默认值、路由参数约束以及对应路由的相关附加数据(datatokens):