ASP.NET Core学习
- 学习资源:http://w3cschool.cn/netcore/
- 微软官方:https://docs.microsoft.com/zh-cn/aspnet/?view=aspnetcore-3.1#pivot=core&panel=core_overview
-
.NET CORE概念及优势总结:
- .net core是.net生态发展的未来;是微软重新设计的、和FW比整个体系、结构完全变化了。
- 开源、跨平台(开发、部署、物联网、云服务)
- 模块化、组件化、体积小、运行速度快
- 维护:不是微软一家了,而有一个社区、.net基金
- 微服务、docker
- 3.0前包含移植了.net fw类库,3.0后不一样了。
- 运行命令行(vs code)、部署灵活
- 向下兼容(与FW兼容)
- .Net Core目前3.1,下一代.Net5(16年.net core1,19年.net core 3.1)
- .net core3.1目前支持:winform\wpf不太完善、asp.net core 3.0、EF core 3.0
-
ASP.NET CORE 学习要点:
启动流程、主机配置、IOC、服务、管道、中间件、应用配置、多环境、日志、路由、异常、处理、静态文件、部署
-
启动:自宿主、IIS 2种
入口点:Startup.cs
看代码:Program.cs
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => //这里默认配置 //环境变量(DotNet开关) //加载命令行参数 //加载应用配置 //配置的默认日志组件 Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { //这里进行-组件配置 //webBuilder.ConfigureKestrel((context,option)=>option.Limits.MaxRequestBodySize=1024);//示例 //webBuilder.ConfigureLogging((context,builder)=>builder...; //这里是-主机配置项 webBuilder.UseStartup<Startup>(); //配置主机的方式: //(1)硬编码 //(2)环境变量(ASPNETCORE开关的,不管配置在什么地方) //(3) 应用配置(appsettings.json) //(4)命令行(优先级最高) //这里改变了端口(这里的硬编码先生效了,端口实际默认配置在Properties下面的launchSettings.json中) webBuilder.UseUrls("http://*:6000"); //也可以在命令行(bin目录下)运行命令启动:dotnet WebApplication-NetCoreTest.dll --urls http://*:7999 }); }
通过下面的命令行运行看,代码中虽然配置了6000端口,但命令行优先级最高
- Host.CreateDefaultBuilder主机:管理web应用程序启动、生存期管理、配置、请求处理管道、日志、IOC(实际是封装了应用资源的一个对象)
- 流程:创建主机生成器》配置》创建主机》运行主机
- kestrel:跨平台、类IIS、高性能、支持HTTPS\HTTPS/2、在linux下性能更高、不支持反向代理、负载均衡(主要用于后端WEB托管、调试,最好不放在前端,应该用iis\nginx代替)
http请求 > 反向代理 > webserver kertrl > 中间件 > 返回给客户
-
配置介绍
-
- 命令行配置(通过运行时在命令行里输入的参数)=========默认参数(代码里的硬编码参数)
- Json文件配置(使用json文件的配置)
- 从配置文件文本到c#对象实例的映射 - Options 与 Bind(将配置文件的配置绑定到一个C#的类【直接映射】https://blog.csdn.net/Upgrader/article/details/104785213/)
- 配置文件热更新(不用重新启动)【用IoptionSnapeShot】
- 框架设计:Configuration
-
其他配置:
-
- (已安装或已创建的)自定义提供程序
- 目录文件
- 环境变量
- 内存中的 .NET 对象
net core 中的配置====参考资源:https://www.w3cschool.cn/netcore/netcore-vaqb31ks.html
依赖注入:
参考资源:http://www.jessetalk.cn/2017/11/06/di-in-aspnetcore/
实现方式:通过依赖倒置和IOC容器注入来实现的
- 客户端new一个对象时,不依赖于具体实现,而依赖于一个抽象
- 通过IOC容器将对象注入进来,而不是客户端类自己去new一个对象【不用自己去拿,而是别人拿什么来,你就用什么】
优点:
- 解耦:对于客户端类来说,解除对 对象的强依赖,很容易替换掉依赖的类,对于被引用过很多次的类很容易就替换掉了【容器给你什么对像就用什么对象】
- 松耦合让代码更具灵活性,能更好地应对需求变动综上所述项目维护将带来好处。
- 单元测试友好:在测试方法里,直接new各种对象,然后扔到一个controler的构造函数里就可以了。
注入的方式:
- 构造函数注入
- 属性注入
隐式依赖:把一个类用到的所有外部组件放到一个类最上面,在构造函数里面初始化
private CustomerContext _context; public CustomerController() { _context = new CustomerContext(new DbContextOptions<CustomerContext>{}); }
显示依赖:需要用到的地方再初始化,不推荐
var context = new CustomerContext(new DbContextOptions<CustomerContext>{});
实例的生命周期之单例
DI在ASP.NET Core中的应用
- 在Startup类中初始化:Startup.cs的 ConfigureService中配置DI,大家看到 IServiceCollection这个参数应该就比较熟悉了
public void ConfigureServices(IServiceCollection services) { services.AddTransient<ILoginService<ApplicationUser>, EFLoginService>(); services.AddMvc(); )
private ILoginService<ApplicationUser> _loginService; public AccountController( ILoginService<ApplicationUser> loginService) { _loginService = loginService; }
-
View中使用:
@using MilkStone.Services; @model MilkStone.Models.AccountViewModel.LoginViewModel @inject ILoginService<ApplicationUser> loginService <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head></head> <body> @loginService.GetUserName() </body> </html>
-
通过 HttpContext来获取实例
HttpContext下有一个RequestedService同样可以用来获取实例对象,不过这种方法一般不推荐。同时要注意GetService<>这是个范型方法,默认如果没有添加Microsoft.Extension.DependencyInjection的using,是不用调用这个方法的。
HttpContext.RequestServices.GetService<ILoginService<ApplicationUser>>();