06-课程重点ASP.NET CORE介绍
ASP.NET CORE是基于.NET CORE,就好比我们以前的ASP.NET 基于.NET。只不过 带有ASP.*** 那么就是用来开发WEB应用的。它的架构上和以前有点不一样,另外 它不再基于system.web.dll 这些。
统一的构建方式
配置简单 适用于云程序
本身就带依赖注入
轻量级 模块化的HTTP请求管道
完全以nuget包的形式发布
跨平台运行
ASP.NET CORE应用
我们看一下代码 它和以前的asp.net项目有点不一样,他是有Program.cs 的 里面也有main方法。所以 ASP.NET CORE应用 其实就是一个控制台程序 只不过是这个控制台的main方法中 创建一个web应用。
Startup类似以前的global文件,它做一些初始化 和注册一些中间件 已经服务。
Configure: This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 就是这个在启动的时候被调用 使用这个方法去配置HTTP请求管道。
ConfigureServices: This method gets called by the runtime. Use this method to add services to the container. 这个方法也是运行的时候被调用 使用这个方法 可以给容器加入服务。
asp.net core是一个控制台程序?
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}Code language: PHP (php)
CreateDefaultBuilder 创建一个默认的Builder,通过这个builder 可以定义web服务器和startup。
UseStartup方法指定应用的startup类,startup类用于定义请求处理管道和配置应用需要的服务,它必须是公开的。
public class Startup
{
//定义我们的应用使用的服务器 我这里是mvc
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
//定义我们请求管道的中间件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
}
}Code language: PHP (php)
IOC服务
服务是应用中用于通用调用的组件,服务通过依赖注入获取并使用。ASP.NET CORE内置了一个IOC控制反转容器,默认支持构造器注入 可以很方便替换为我们自己的IOC容器。因为使用了DI 依赖注入 所以我们在整个应用都都可以使用服务 比如我们的日志服务 Logging。
07-理解中间件的原理和自定义中间件
Configure方法之后执行一次 就是程序启动的时候。中间件是一个类 ,这些类加入到管道,这些中间件是有顺序的是 从上到下。这些中间件 可以把 工作交给下一个中间件 也可以结束执行,可以使用中间件请求处理管道。中间件是一个HttpContext执行异步逻辑,在Configure方法调用IApplicationBuilder的一个对应的UserXYZ扩展方法。
ASP.NET CORE本身有丰富的中间件:静态文件 路由 身份认证等。当然我们也可以自定义中间件 后面我们来介绍。
asp.net core 本身级有一些中间件,自定义中间件去理解。中间件就好比往这个HTTP管道里面 插入一些方法 这些方法 加到了管道流(函数链-委托)他就会一个个的排队执行。那么我们的中间件的方法 可以选择交给下一个中间件 如果不交的话 那么久相当于直接直接处理完了 就返回去了。
添加一个类 作为中间件
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MvcDemo
{
public class AMiddleware
{
private RequestDelegate _next;
/// <summary>
/// 管道执行到达我们的中间件的时候 从上一个中间件 接收到RequestDelegate 委托
/// </summary>
/// <param name="next"></param>
public AMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// 给HTTP请求管道 加入业务进去
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
//await _next.Invoke(context);
await context.Response.WriteAsync("AMiddleware<BR/>");
await _next(context);//交给下一个中间件
await context.Response.WriteAsync("AMiddleware<BR/>");
}
}
}Code language: JavaScript (javascript)
加一个扩展方法 来use这个中间件到我们的管道里面
/// <summary>
/// 用来注册我们的中间件的扩展方法
/// </summary>
public static class MiddleWareExtensions
{
/// <summary>
/// 注册A中间件
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IApplicationBuilder UseAMiddleWare(this IApplicationBuilder builder)
{
return builder.UseMiddleware<AMiddleware>();
}
}Code language: PHP (php)
当然这个可以不用扩展方法,直接这样子 直接在configure里面 注册:app.UseMiddleware<AMiddleware>();
在configure方法里面 注入中间件
app.UseStaticFiles();
//往管道中加入我们的中间件
//app.Map("/", HandleHtml);
app.UseAMiddleWare();
app.UseBMiddleWare();
//app.UseCMiddleWare();
app.UseMiddleware<CMiddleware>();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});Code language: JavaScript (javascript)
08-ConfigureServices配置服务容器-以依赖注入服务来举例AddSingleton
这个方法 可以配置很多东西 这里我们先提一下 后面再来解析,比如 配置数据库连接地址、配置MVC服务、配置依赖注入等等。
ASP.NET CORE依赖一个Http Server实现转发请求到应用程序中。转发的请求会以一组featuer接口的形式被包装,然后被应用程序组合到一个httpcontext中。ASP.NET CORE包含一个跨平台的web服务器 Kestrel。
configureservice有很多addxxx的方法(AddSingleton、AddScoped、AddTransient等重载),这些add方法 就算被服务容器 注入服务。后面我们会介绍一些用到的服务,接下来我们就来讲一个 依赖注入的使用。
演示一下 使用ConfigureService配置
namespace MvcDemo
{
public interface ISend
{
void Execute();
}
}
namespace MvcDemo
{
public class SendEmail : ISend
{
public void Execute()
{
}
}
}Code language: PHP (php)
然后再configureservice里面注册
services.AddSingleton<ISend, SendEmail>();Code language: HTML, XML (xml)
然后控制器里面 使用
namespace MvcDemo.Controllers
{
public class HomeController : Controller
{
public ISend _send { get; set; }
public HomeController(ISend send)
{
_send = send;
}
public IActionResult Index()
{
//ISend isd = new SendEmail();
//isd.Execute();
_send.Execute();
return View();
}
}
}