ASP.NET Core MVC读书笔记整理

举报
花溪 发表于 2021/06/17 08:06:36 2021/06/17
【摘要】 今天主要学习内容知识点回顾:Asp. NET Core 从入门到学会如何做一个安全可复用的框架配套源码:yoyomooc / MockSchool · GitLab  https://code.52abp.com/yoyomooc/MockSchool2.1 什么是MVC?2.1.1.mvc是如何工作的2.1.2.mvc中的控制器controller2.1.3.详解mvc的设计模式MVC是用...

今天主要学习内容知识点回顾:Asp. NET Core 从入门到学会如何做一个安全可复用的框架

配套源码:yoyomooc / MockSchool · GitLab  https://code.52abp.com/yoyomooc/MockSchool

2.1 什么是MVC?

2.1.1.mvc是如何工作的

2.1.2.mvc中的控制器controller

2.1.3.详解mvc的设计模式

MVC是用于实现应用程序的用户界面层的架构设计模式。

  • 模型(Model):包含一组数据的类和管理该数据的逻辑信息。
  • View(视图):包含显示逻辑,用于显示Controller提供给它的模型中数据。
  • controller ():http, ,(控制器):处理Http请求,调用模型,请选择一个视图来呈现该模型。

2.2 在ASP. NET Core项目中配置MVC?

将所需的MVC服务添加到asp. net core中的依赖注入容器中。

public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc();
}

添加MVC中间件到我们的请求处理管道中。

public void Configure(TApplicationBuilder app, IHostingEnvironment env)
{
//如果 Development环境是,调用 Developer Exception Page
 if (env. IsDevelopment())
{
  app.UseDeveloperExceptionPage();
}
 app.UsestaticFiles();
 app.UseMvcwithDefaultRoute();
}

 AddMvc和 AddMvcCore他们是什么关系?

  • AddMvcCore()方法只会添加最核心的MVC服务。
  • AddMvc()方法添加了所有必需的MVC服务。
  • AddMvc()方法会在内部调用AddMvcCore()方法。

2.3 依赖注入的重要性

2.3.1.什么是依赖注入

维基百科:“依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一个依赖对象(或客户端)并成为客户状态的一部分。该模式通过自身的行为分离了客户依赖的创建,这允许程序设计是松耦合的,同时遵循依赖倒置和单一职责原则。与服务定位器模式直接进行对比,它允许用户了解他们用来查找依赖的机制。”

依赖注入服务的热点:

  • 帮助程序实现松散耦合
  • 依赖注入服务需要寻遵循依赖倒置与单一职责原则
  • 依赖注入所提供的作用域模式可以保留整个HTTP请求范围

2.3.2.ASP. NET Core依赖注入的配置

{
configuration configuration:
}

 public void ConfigureServices(IServiceCollection services)
{
 services. AddMve( setupAction: a Mveoptions =>a. EnableEndpointRouting false);
 services. AddSingleton<IStudentRepository, MockStudentRepository>();
}

2.3.3.ASP. NET Core依赖注入

ASP. NET Core依赖注入容器注册服务

  •  AddSingleton()  顾名思义, AddSingleton(方法创建一个Singleton'Singleton'服务。首次请求时会创建服务。然后,所有后续的请求中都会使用相同的实例。因此,通常,每个应用程序只创建一次Singleton'服务,并且在整个应用程序生命周期中使用该单个实例
  •  AddTransient() 此方法创建一个 Transient'服务。每次请求时,都会创建一个新的 Transient'服务实例。
  •  AddScoped()  此方法创建一个Scoped服务。在范围内的每个请求中创建一个新的 Scoped服务实例。例如,在Web应用程序中,它为每个http请求创建1个实例,但在同一Web请求中的其他服务在调用这个请求的时候,都会使用相同的实例。注意,它在一个客户端请求中是相同的,但在多个客户端请求中是不同的。

 Scoped服务和 Transient服务之间的主要区别:

  • 使用 Scoped ), http http作用域)服务服务,我们在限定的http请求范围内获得相同的实例,但跨不同的http请求获得新实例
  • 对于 Transient http瞬时服务)服务,每次请求实例时都会提供一个新实例,无论它是否在同一http的范围内请求或跨越不同的http请求
  • 使用 Singleton单例服务,只有一个实例。首次请求服务时,将创建一个实例,并且整个应用程序中的所有http请求都使用该实例。

2.3.4.依赖注入亮点

  • 低耦合
  • 提供了高测试性,使单元测试更加的容易

2.4 ASP.NET Core中的模型绑定与模型验证

  • 模型绑定是将HTTP请求中的数据映射到控制器操作方法上对应的参数。
  • 操作方法中的参数可以是简单类型,如整数,字符串等,也可以是复杂类型,如 Customer, Employee, Order等模型。
  • 模型绑定很棒,因为有了它我们会节约大量的时间,如果没有它,我们必须编写大量自定义代码来将请求数据映射到操作方法参数,这不仅无聊乏味而且容易出错。

2.4.1.ASP NET Core中的模型绑定

  • 模型绑定是将HTTP请求中的数据映射到控制器操作方法上对应的参数。
  • 操作方法中的参数可以是简单类型,如整数,字符串等,也可以是复杂类型,如 Customer, Employee, Order等。
  • 要将HTTP的请求数据绑定到控制器操作方法上对应的参数上,模型绑定将按以下指定的顺序在以下位置查找来自HTTP请求中的数据。
     Form values(表单中值)
     Route values(路由中的值)
     Query strings(查询字符串)

2.4.2.ASP NET Core中的模型验证

  • 在属性上添加验证属性
 public class Student
{
 public int Id {get; set;}
[ Required(ErrorMessage="请输入名字"), MaxLength(50, ErrorMessage="名字的长度不能超过50个字符")]
[Display(Name="名字")
 public string Name {get; set;}
 [Required]
[Display(Name="班级信息")]
 public ClassNameEnum? ClassName {get; set;}
[Display(Name="电子邮件")]
 [RegularExpression(@"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-z0-9-.]+$",
 ErrorMessage="邮箱的格式不正确")]
[ Required(ErrorMessage="请输入邮箱地址")]
 public string Email {get; set;}
}
  • 使用 ModelState. IsValid属性验证属性是成功还是失败
 [httppost]
 public IActionResult Create(Student student)
{
 if (ModelState. IsValid)
{
 Student newStudent =_studentRepository. Add(student);
 return RedirectToAction("Details", new id newStudent. Id });
}
 return View();
}
  • 使用asp-validation-for和asp-validation-summary标签帮助器来显示错误信息
<div asp-validation-summary="All" class="text-danger"></div>
<div class="form-group row">
 <label asp-for="Name" class="col-sm-2 col-form-label"></label>
	 <div class="col-sm-10">
		<input asp-for=name" class=form-control-" placeholder="请输入名字"/>
		<span asp-validation-for=""class="text-danger"></span>
	 </div>
 </div>
<div class="form-group row">
	 <label asp-for="Email" class="col-sm-2 col-form-label"></label>
	 <div class="col-sm-10">
		<input asp-for="Email" class="form-control" placeholder="请输入邮箱地址"/>
		 <span asp-validation-for="Email" class="text-danger"></span>
	 </div>
 </div>

2.4.3. Modelstate. IsValid属性验证

  • 提交表单时,将执行Create()操作方法
  • 在创建学生表单视图中表单模型是 Student类
  • 提交表单时,模型绑定将Post请求的表单值映射到 Student类的对应属性上。
  • 在**Name**属性上添加了**Require**属性,它会判断Name中的值,如果该Name中的值为空,或者属性不存在,则会验证失败。
  • 使用 ModelState. IsValid属性会检查验证是失败是成功。
  • 如果验证失败,我们返回相同的视图以便用户可以提供所需的数据并重新提交表单。

2.5 使用 Entity Framework Core数据访问

2.5.1.什么是 Entity Framework Core

  •  ORM(对象关系映射器) ObjectRelational- Mapper
  •  EF Core是轻量级,可扩展和开源的软件
  •  EF Core也是跨平台的
  •  EF Core是微软官方推荐的数据访问平台。

2.5.2.领域类

2.5.3.Code FirstDB与 First

 EF Core支持许多**关系数据库**甚至**非关系数据库**。 EF Core可以通过使用称为数据库提供程序的插件库来实现此目的。这些数据库提供程序以 NuGet包的形式提供。

而随着时间的推移会支持更多的数据库,我们可以通过下方的URL进行查看:https://docs.microsoft.com/zh-cn/ef/core/providers/
数据库提供程序,通常位于 EF Core及其支持的数据库之间。数据库提供程序包含特定于其支持的数据库的功能。所有数据库通用的功能都在 EF Core组件中而对于一些特定于数据库的功能,例如, Microsoft SQLServer特定功能需要与 EF Core的 SQLServer提供程序一起使用。

2.5.4.Entity Framework Core包

2.6 为什么推荐采用仓储模式

2.6.1.ASP. NET Core中的仓储模式

它可以让AP. NET Core在请求**IStudentRe**实例时提供**SQLStudentRepository**类的实例。

它使我们的代码更清晰,更易于重用和维护。

  • 它使我们能够创建松散耦合的系统。例如,如果我们希望应用程序与 Oracle数据库工作而不是使用 SQLServer工作,那么我们只需要实现一个**racleRepository**,再使用依赖注入系统来注册**OracleRepository**,那么就可以轻松实现一个基于 Oracle数据库的读取和保存的仓储服务。
  • 在单元测试项目中,我们也很容易用模拟的实现来替换真实的仓储以进行测试。
  • 仓储模式不是特定说服务于数据库模式,只是在我们实际开发中,经常与数据库打交道而已,所以经常使用数据库仓储模式,除此以外在一些公司里面进行大量单元测试的时候也会用到内存仓储模式。

在 EF Core中使用Sql Server

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。