章节:

第一章:https://www.cnblogs.com/kimiliucn/p/17613434.html

第二章:https://www.cnblogs.com/kimiliucn/p/17620153.html

五、创建项目+Seesion传值

5.1-使用Session

5.2-Log4Net组件使用

(1)管理Nuget程序,下载【log4net】和【Microsoft.Extensions.Logging.Log4Net.AspNetCore】


(2)新建一个文件夹,保存log4net配置文件,一定要在【属性】中的 复制到输出目录 选择【始终复制】。

(3)在【Program.cs】文件的【CreateHostBuilder】方法中配置log4net。

也可以使用以下方式配置(在Startup中):
这里注意,别选择错了!然后就可以了。

六、程序的发布运行

6.1-项目的发布

(1)右击项目,选择【发布】


(2)选择【文件夹】

(3)选择要保存的路径,然后点击【完成】;

(4)点击【发布】,可以看到已经发布完成了。

6.2-项目的运行

6.2.1-IIS发布

  • IIS直接简历网站,目录指向项目跟目录下的Debug、Net5文件;——不行
  • 把项目发布后,目录指向项目发布目录;——可以的

6.2.2-ASP.NET Core跨平台原因

6.2.3-使用脚本启动网站

6.2.4-发布之后运行为什么样式加载不出404?
(1)需要在【startup.cs】文件的【Configure】方法中引入一个中间件。

七、命令参数读取+配置多种读取

7.1-配置文件读取(1)

在【startup.cs】文件中读取配置文件

在【控制器】中读取配置文件。
(1)先构造函数注入Configure

(2)写代码获取

7.2-配置文件读取(2)

(1)定义一个类,结构(数据类型、属性名)和配置文件中完全一致。

(2)在【Startup.sc】配置一下

(3)在控制器中,构造函数注入一个IOptions

(4)获得并返回值

(5)前端获取值

八、MVC开发

8.1-什么是MVC?

  • V——View——视图:呈现给用户看到的内容(表现层)
  • C——Controller——控制器:控制业务逻辑计算,调用服务,选择返回什么内容,可以返回视图,JSON、字符串等等。
  • M——Model——视图模型:用作控制器和视图之间传递数据的载体。

8.2-cshtml文件

其实是一个类文件。
Razor混编:可以在cshtml上写 后台C#代码 + 前台html代码,混合起来写;
(1)可以引入命名空间

(2)直接写后台代码

(3)实现接口

(4)可以依赖注入

(5)可以添加特性Class

(6)定义方法并调用

(7)写单行代码、多行代码




(8)Razor表达式

(9)输出尖括号

(10)for循环

(11)在后台代码内部写HTML代码

8.3-如何解决修改视图后无需编译后即可生效?

修改视图,增加了html代码,不能马上生效,怎么办?使用中间件

1.引入Nuget包

2.在【Startup.cs】文件的票【ConfigureServices】方法中配置。

8.4-Razor布局

8.4.1-我们看到的页面组成到底有哪些内容?
答:包含了Layout的模板嵌套的返回的需要渲染的视图内容;

8.4.2-如何嵌套呢?
答:通过Layout中RendBody()方法做了替换;把返回的视图替换到模板也中,形成了一整块的内容;目的在于每一次返回不同的页面的时候,能够吧不变的视图部分,种以重用;这样就可以少些代码。

8.4.3-在模板页面导入了JQ,在视图页面使用JQ为什么报错?
注意:

  • 在模板页中使用CSS/JS的时候,为了提高效率,会把Css引入在模板的上方,将JS写在模板的下方。页面嵌套到模板页后,就会出现在引用JS的上方调用JS,此时JS其实是调用不了的。


答:因为Script是写在下面的,先加载RenderBody,后加载JQ,所以会报错,解决方法如下:

九、Razor扩展-HTML控件

9.1-Html扩展控件(1)

本质:通过一个后台方法,返回一个【已经存在】的Html标签的字符串,浏览器在读取的时候,就读取成一个Html标签。
1.定义

 /// <summary>
/// 图片
/// </summary>
/// <param name="helper"></param>
/// <param name="src"></param>
/// <returns></returns>
public static IHtmlContent Img(this IHtmlHelper helper,string src,string @class)
{
return new HtmlString($"<img src='{src}' class='{@class}'/>");
}

2.调用

<!--1.引入命名空间-->

<!--2.使用图片--自定义 扩展方法-->
@Html.Img("https://tpc.googlesyndication.com/simgad/3105023548593992165/downsize_200k_v1?w=200&h=200","border:1px solid red;")

9.2-Html扩展控件(2)

通过一个后台方法,返回一个【不存在】的Html标签的字符串,在读取的时候,通过制后台方法,去生成我们制定的标签。
1.写一个扩展方法,定义一个普通类,类名建议以TagHelper结尾,加上特性;如果没有标记特性,视图中在调用的时候使用当前类名去掉TagHelper后缀得到的的字符串来调用。继承TagHelpre抽象类、或者实现接口ITagHelpr,二者选一起均可。然后实现接口Proccss方法。

2.在【_ViewImports.cshtml】进行注册

3.使用

9.3-Razor局部视图

1.创建一个局部视图

2.进行调用

9.3.1-局部视图的缺陷:
局部视图没有去访问控制器中的Action,所以不能完美的实现后台代码。可以使用视图组件解决。

9.4-视图组件-扩展定制

9.4.1-视图组件的优点?

  • 呈现页面相应的某一部分而不是整个相应
  • 包括在控制器和视图之间发现的关注分离和可测试性优势
  • 可以具有参数和业务逻辑
  • 通常在页面布局中调用

9.4.2-如何自定义视图组件?
(1)Rzaor组件对应的类需要以ViewComponent结尾,该类需要继承自ViewCompnent类。

(2)定义一个异步版本的InvokeAsync,可以自定义参数,IncokeAsync就是返回组件内容的方法。

(3)在Views/Shared文件下建立Components文件夹,在这个文件下创建一个和组件类名相同(如果加了特性,就按照特性上面的名称来)的文件夹,然后创建一个Default.cshtml视图。

注意:以上步骤可以不按照上面执行,我们可以随意新建一个视图,然后指定路径就可以了。

(4)调用

十、内置容器基本使用

10.1-什么是IOC?

把对象的创建,统一交给第三方容器来创建;

10.2-如何使用IOC?

(1)在【Startup.cs】的【ConfigureServices】中注册服务;注册抽象和具体的依赖关系;

(2)通过构造函数进行依赖注入,自动得到服务的实例;

(3)调用;

10.3-如何使用IOC?(第二种方法)

(1)在【Startup.cs】的【ConfigureServices】中注册服务;注册抽象和具体的依赖关系;

(2)通过构造函数进行依赖注入。

(3)调用;

10.4-在视图中使用IOC

10.4-什么是依赖注入?

DI依赖注入:IServiceCollection支持且支持构造函数注入。
如对象A依赖对象B,对象B依赖于对象C,就可以先构造对象C,然后传递给对象B,然后传递给对象A,然后得到具体的实例。可以支持无限层级的依赖注入,前提是先要先注入服务(注册抽象和具体的映射关系)。

10.5-IServiceCollection生命周期

那么在创建对象的时候, 不同的情况,需要让对象单例,每一次都创建新的对象实例,不同的作用于创建新的实例。
AddTransient:顺时声明周期,每次获取的都是不同的实例

AddSingleton:单例生命周期,在整个进程中获取的都是同一个实例

AddScoped:作用域生命周期(同一个作用域,获取的是同一个对象的实例,不同的作用域,获取的是不同的独对象实例)

建议:开发工作中,一般情况下,都是一个请求一个对象的实例,所以使用的是顺时声明周期(AddTransient)。

十一、Autofac容器

11.1-Autofac容器初识?

Autofac也是一款流行的IOC容器;

11.2-如何使用Autofac容器?

(1)管理Nuget程序包,下载并安装【Autofac】

(2)在【Startup.cs】的【ConfigureServices】中注册服务;

11.3-Autofac注入方式-构造函数注入


11.4-Autofac注入方式-属性注入


11.5-Autofac注入方式-方法注入


11.6-Autofac生命周期-瞬时生命周期(默认)

瞬时生命周期:每一次获取对象都是一个全新的实例,默认的生命周期。

11.7-Autofac生命周期-单例生命周期

单例声明周期:在整个进程中,对象永远都是同一个实例(SingleInstance)

11.8-Autofac生命周期-每个生命周期范围一个实例

每个生命周期范围一个实例:同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样。(InstancePerLifetimeScope)

11.9-Autofac生命周期-每个匹配生命周期范围一个实例

语法:InstancePerMatchingLifetimeScope(名称)

11.10-Autofac生命周期-每个请求一个实例

11.11-Autofac支持配置文件

(1)管理Nuget包,引入3个程序集;

(2)新建一个配置文件【autofac.json】,记得将配置文件设置为:始终复制到目录。


(3)在【Startup.cs】的【ConfigureServices】中注册服务;

11.12-Autofac整合MVC

注意:Autofac是一个第三方容器;
(1)指定Autofac工厂替换默认工厂,在【Program.cs】中的【CreateHostBuilder】方法中指定。

(2)在【Startup.cs】类中增加一个【ConfigureContainer】方法,用来注册服务关系。

/// <summary>
/// 增加一个方法:
/// 整个方法被Autofac自动调用
/// 负责注册各种服务
/// </summary>
/// <param name="services"></param>
public void ConfigureContainer(ContainerBuilder containerBuilder) {
containerBuilder.RegisterType<TestServiceA>().As<ITestServiceA>();
containerBuilder.RegisterType<TestServiceB>().As<ITestServiceB>();
containerBuilder.RegisterType<TestServiceC>().As<ITestServiceC>();
containerBuilder.RegisterType<TestServiceD>().As<ITestServiceD>().PropertiesAutowired();
containerBuilder.RegisterType<TestServiceE>().As<ITestServiceE>();
}

(3)通过控制器构造函数注入,获取实例。

这种方法也还能用:

11.13-Autofac支持控制器属性注入

(1)首先在【Startup.cs】中【ConfigureServices】方法中,指定控制器实例容器来创建,进行替换。

(2)创建一个类(特性);

(3)创建一个类,用来判断维度;

(4)在【Startup.cs】中创建一个【ConfigureContainer】方法,负责注册各种服务。

11.14-Autofac一个实例多实现的问题

注意:

  • 如果一个抽象多个实例,都注册了,通过构造函数用抽象类型来获取实例,哪个是后面注册的,就能获得哪个,覆盖类型的。
  • 如果一个抽象多个实例,都注册了,可以通过一个IEnumerable<抽象类>,当做构造函数参数,可以获取到左右注册的具体的实例。


一般使用以下方法:
(1)在【Startup.cs】中创建的【ConfigureContainer】方法中,注册资源和实现(单抽象、多实现)

(2)通过构造函数中,使用具体理性实理性做我参数,可以匹配到不同的具体类型实例。


(1)新建一个类,该类继承Module类,实现Load方法。

(2)与之前相同,不同的而方式:在【Startup.cs】中创建的【ConfigureContainer】方法中,注册资源和实现(单抽象、多实现)

11.15-Autofac通过抽象(接口)支持AOP(面向切面编程-做应用型系统)

AOP-面向切面编程:不用修改之前代码的基础上,可以动态的在某个动作之前加一些操作,动态的在某一个动作之后做点什么事。
(1)管理Gurget程序包,下载【Castle.Core】包,该包用来动态代理。

(2)创建一个类为【CustomAutofacAop】,该类继承自【IInterceptor】接口,并实现接口中的【Intercept】方法。

(3)在服务的抽象上面做一个标记,这个标记是用来:支持AOP扩展能够生效。

(4)因为这个【CustomAutofacAop】实例也是通过Autofac的IOC来做的,所以需要在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务,让Autofac支持AOP。

11.16-Autofac通过类支持AOP

(1)管理Gurget程序包,下载【Castle.Core】包,该包用来动态代理。

(2)创建一个类为【CustomAutofacAopClass】,该类继承自【IInterceptor】接口,并实现接口中的【Intercept】方法。

(3)在类上面做一个标记,这个标记是用来:支持AOP扩展能够生效。

(4)因为这个【CustomAutofacAop】实例也是通过Autofac的IOC来做的,所以需要在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务,让Autofac支持AOP。

11.17-Autofac单抽象多实现构造函数注入(MVC)

(1)在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务。

(2)在控制器中调用。

11.18-Autofac单抽象多实现属性注入

(1)道理和上面是一样的,可以吧Autofac上下文当做属性来注入。

(2)在使用的时候,通过Autofac上下文+不同注册的标识,获取到不同的具体实例。

上一篇:https://www.cnblogs.com/kimiliucn/p/17613434.html

原文地址:https://www.cnblogs.com/kimiliucn/p/17620153.html

.NET5从零基础到精通:全面掌握.NET5开发技能【第二章】的更多相关文章

  1. 如何从Python负零基础到精通数据分析

    一.为什么学习数据分析 1.运营的尴尬:运营人需要一个硬技能每个初入行的新人都会察觉到,运营是一个似乎并没有自己的核心竞争力和安全感的工作.因为每天的工作好像都被各种琐事所围绕,而只有一个主题是永恒不 ...

  2. [原]零基础学习在Android进行SDL开发系列文章

    [原]零基础学习SDL开发之移植SDL2.0到Android [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 [原]零基础学习SDL开发之在Android使用SDL2.0显示 ...

  3. Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio

    原文:Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio 通过前面几期的学习,我们知道了Android的前世今生,也了解了Android的系统架构和应用组件,也 ...

  4. 零基础到精通Web渗透测试的学习路线

    小编相信很多新手都会遇到以下几个问题 1.零基础想学渗透怎么入手? 2.学习web渗透需要从哪里开始? 这让很多同学都处于迷茫状态而迟迟不下手,小编就在此贴给大家说一下web渗透的学习路线,希望对大家 ...

  5. 零基础到精通Linux,从这篇文章开始

    2018年想做Linux运维的人应该如何学习才能快速精通Linux? Linux入门这么简单,为什么很多人学不会? 想要成为一个合格的运维工程师,到底怎么才能从零开始精通Linux? 作为一个运维小白 ...

  6. [资料分享]ACCESS2013 零基础到精通

    Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft O ...

  7. 程序员必备英语.net版(.net菜鸟的成长之路-零基础到精通)

    通过一段时间的.NET学习,我发现英文不好是我的软肋~我觉得好好补习一下英文单词水平.可是要背哪些单词呢? 经过一段时间的整理,终于整理出来了一套比较完整的.NET程序员必备单词文档.单词加详细说明. ...

  8. C#基础学习第三天(.net菜鸟的成长之路-零基础到精通)

    1.复合赋值运算符 += -= *= /= %= 2.关系运算符  > < >= <= == !=  由关系运算符连接的表达式我们称之为关系表达式.  每一个表达式都可以求解出 ...

  9. C#基础学习第二天(.net菜鸟的成长之路-零基础到精通)

    1.加号的使用  在我们c#当中,如果想要两个字符串相连接,那么我们可以使用+号连接.  加号两边如果有一边是字符串,那么此时字符串起到了一个连接的作用.  如果加号两遍都是数字,那么加号起到一个相加 ...

  10. C#基础学习第一天(.net菜鸟的成长之路-零基础到精通)

    1.Net平台和C#编程语言的概念 2.桌面应用程序: 我们要使用桌面应用程序,必须要安装该应用程序的客户端. winform应用程序. Application:应用程序 Internet:互联网应用 ...

随机推荐

  1. Golang for循环遍历小坑

    一.for循环 循环:让程序多次执行相同的代码块for循环是Go语言中唯一一个循环结构for循环经典语法先执行表达式1执行表达式2判断是否成立,如果成立执行循环体循环体执行完成后,执行表达式3再次执行 ...

  2. List 集合手动分页的方法总结

    前言 在工作中难免会遇到,将组装的集合数据进行分页处理,现在我将自己手动分页的三种方法进行总结,有不对的地方敬请大家批评指正! 一.数据准备 // 当前页 int pageIndex = 1; // ...

  3. sh: vue-cli-service: command not found

    mac环境下运行vue项目报错sh: vue-cli-service: command not found 解决方法:cd到项目目录下,执行命令sudo rm -rf node_modules pac ...

  4. 2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng

    2022-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等. 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < num ...

  5. 2023-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng

    2023-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等. 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < num ...

  6. 2020-10-07:redis存在线程安全的问题吗?为什么?

    福哥答案2020-10-07:#福大大架构师每日一题# Redis6.0的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行.所以我们不需要去考虑控制 key.lua.事务, ...

  7. 2021-12-17:长城守卫军问题。 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军, 每位将军可以驻守一个峰火台,每个

    2021-12-17:长城守卫军问题. 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守. 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1.另外,有m位将军, 每位将军可以驻守一个峰火台,每个 ...

  8. Grafana系列-统一展示-9-Jaeger数据源

    系列文章 Grafana 系列文章 配置 Jaeger data source Grafana内置了对Jaeger的支持,它提供了开源的端到端分布式跟踪.本文解释了针对Jaeger数据源的配置和查询. ...

  9. Python对word文档重排版

    介绍 舍友从网上下载的word题库文档很乱,手动改了大半天才改了一点,想起python是大名鼎鼎的自动化脚本,于是乎开始了python对word的一顿瞎操作. 分析需求 对文档中的内容进行分析,只留下 ...

  10. bootstrap treeview基本运用

    虽然现在有了很多新的前端框架,但是有的时候我们做一个不需要任何其他js编译环境就可以运行的项目,那还是的使用一些老式技术,接下来就来回顾一些bootstrap treeview + jquery的使用 ...