.NET5从零基础到精通:全面掌握.NET5开发技能【第二章】
章节第一章:https://www.cnblogs.com/kimiliucn/p/17613434.html
第二章:https://www.cnblogs.com/kimiliucn/p/17620153.html
五、创建项目+Seesion传值
5.1-使用Session
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813400-903025289.png
5.2-Log4Net组件使用
(1)管理Nuget程序,下载【log4net】和【Microsoft.Extensions.Logging.Log4Net.AspNetCore】
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816059-1086996718.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816060-1101117775.png
(2)新建一个文件夹,保存log4net配置文件,一定要在【属性】中的 复制到输出目录 选择【始终复制】。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813449-485063724.png
(3)在【Program.cs】文件的【CreateHostBuilder】方法中配置log4net。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816211-690317526.png
也可以使用以下方式配置(在Startup中):
这里注意,别选择错了!然后就可以了。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816059-843621474.png
六、程序的发布运行
6.1-项目的发布
(1)右击项目,选择【发布】
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813405-406461092.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815781-1081501802.png
(2)选择【文件夹】
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816000-285187271.png
(3)选择要保存的路径,然后点击【完成】;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813401-1861155585.png
(4)点击【发布】,可以看到已经发布完成了。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815857-783503530.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816155-1891482813.png
6.2-项目的运行
6.2.1-IIS发布
[*]IIS直接简历网站,目录指向项目跟目录下的Debug、Net5文件;——不行
[*]把项目发布后,目录指向项目发布目录;——可以的
6.2.2-ASP.NET Core跨平台原因
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813450-1487797184.png
6.2.3-使用脚本启动网站
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816222-552183801.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816181-1298721689.png
6.2.4-发布之后运行为什么样式加载不出404?
(1)需要在【startup.cs】文件的【Configure】方法中引入一个中间件。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813401-146809250.png
七、命令参数读取+配置多种读取
7.1-配置文件读取(1)
在【startup.cs】文件中读取配置文件
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816178-13944434.png
在【控制器】中读取配置文件。
(1)先构造函数注入Configure
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815979-779749745.png
(2)写代码获取
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813447-2047071640.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816139-1059486227.png
7.2-配置文件读取(2)
(1)定义一个类,结构(数据类型、属性名)和配置文件中完全一致。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815017-142608773.png
(2)在【Startup.sc】配置一下
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813449-658947438.png
(3)在控制器中,构造函数注入一个IOptions
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816013-818077101.png
(4)获得并返回值
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815973-2045249344.png
(5)前端获取值
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813532-473394877.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816091-322498872.png
八、MVC开发
8.1-什么是MVC?
[*]V——View——视图:呈现给用户看到的内容(表现层)
[*]C——Controller——控制器:控制业务逻辑计算,调用服务,选择返回什么内容,可以返回视图,JSON、字符串等等。
[*]M——Model——视图模型:用作控制器和视图之间传递数据的载体。
8.2-cshtml文件
其实是一个类文件。
Razor混编:可以在cshtml上写 后台C#代码 + 前台html代码,混合起来写;
(1)可以引入命名空间
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816186-1819132693.png
(2)直接写后台代码
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813405-1694401044.png
(3)实现接口
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815366-1791833825.png
(4)可以依赖注入
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816187-1885013680.png
(5)可以添加特性Class
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813402-1381419614.png
(6)定义方法并调用
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816194-160639455.png
(7)写单行代码、多行代码
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815998-1062251872.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813445-965752023.png
(8)Razor表达式
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816327-1914726287.png
(9)输出尖括号
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815800-1999707158.png
(10)for循环
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813523-796008457.png
(11)在后台代码内部写HTML代码
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816323-2014619672.png
8.3-如何解决修改视图后无需编译后即可生效?
修改视图,增加了html代码,不能马上生效,怎么办?使用中间件
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816296-1627019009.png
1.引入Nuget包
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813446-735322395.png
2.在【Startup.cs】文件的票【ConfigureServices】方法中配置。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816189-741568921.png
8.4-Razor布局
8.4.1-我们看到的页面组成到底有哪些内容?
答:包含了Layout的模板嵌套的返回的需要渲染的视图内容;
8.4.2-如何嵌套呢?
答:通过Layout中RendBody()方法做了替换;把返回的视图替换到模板也中,形成了一整块的内容;目的在于每一次返回不同的页面的时候,能够吧不变的视图部分,种以重用;这样就可以少些代码。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816188-1284606642.png
8.4.3-在模板页面导入了JQ,在视图页面使用JQ为什么报错?
注意:
[*]在模板页中使用CSS/JS的时候,为了提高效率,会把Css引入在模板的上方,将JS写在模板的下方。页面嵌套到模板页后,就会出现在引用JS的上方调用JS,此时JS其实是调用不了的。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813514-2050525477.png
答:因为Script是写在下面的,先加载RenderBody,后加载JQ,所以会报错,解决方法如下:
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816062-407578266.png
九、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='https://www.cnblogs.com/{src}'class='{@class}'/>");
}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方法。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816148-2121901237.png
2.在【_ViewImports.cshtml】进行注册
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813359-704369859.png
3.使用
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816104-596761511.png
9.3-Razor局部视图
1.创建一个局部视图
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816225-913708939.png
2.进行调用
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813359-570920085.png
9.3.1-局部视图的缺陷:
局部视图没有去访问控制器中的Action,所以不能完美的实现后台代码。可以使用视图组件解决。
9.4-视图组件-扩展定制
9.4.1-视图组件的优点?
[*]呈现页面相应的某一部分而不是整个相应
[*]包括在控制器和视图之间发现的关注分离和可测试性优势
[*]可以具有参数和业务逻辑
[*]通常在页面布局中调用
9.4.2-如何自定义视图组件?
(1)Rzaor组件对应的类需要以ViewComponent结尾,该类需要继承自ViewCompnent类。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816172-2033307618.png
(2)定义一个异步版本的InvokeAsync,可以自定义参数,IncokeAsync就是返回组件内容的方法。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816004-1957426751.png
(3)在Views/Shared文件下建立Components文件夹,在这个文件下创建一个和组件类名相同(如果加了特性,就按照特性上面的名称来)的文件夹,然后创建一个Default.cshtml视图。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813450-195101914.png
注意:以上步骤可以不按照上面执行,我们可以随意新建一个视图,然后指定路径就可以了。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816379-732968169.png
(4)调用
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816201-153348974.png
十、内置容器基本使用
10.1-什么是IOC?
把对象的创建,统一交给第三方容器来创建;
10.2-如何使用IOC?
(1)在【Startup.cs】的【ConfigureServices】中注册服务;注册抽象和具体的依赖关系;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813453-1650238236.png
(2)通过构造函数进行依赖注入,自动得到服务的实例;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816362-1702859887.png
(3)调用;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816006-610531201.png
10.3-如何使用IOC?(第二种方法)
(1)在【Startup.cs】的【ConfigureServices】中注册服务;注册抽象和具体的依赖关系;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813472-1412872402.png
(2)通过构造函数进行依赖注入。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816121-1126344581.png
(3)调用;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134815970-1200495545.png
10.4-在视图中使用IOC
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813515-96440003.png
10.4-什么是依赖注入?
DI依赖注入:IServiceCollection支持且支持构造函数注入。
如对象A依赖对象B,对象B依赖于对象C,就可以先构造对象C,然后传递给对象B,然后传递给对象A,然后得到具体的实例。可以支持无限层级的依赖注入,前提是先要先注入服务(注册抽象和具体的映射关系)。
10.5-IServiceCollection生命周期
那么在创建对象的时候, 不同的情况,需要让对象单例,每一次都创建新的对象实例,不同的作用于创建新的实例。
AddTransient:顺时声明周期,每次获取的都是不同的实例
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816068-428146733.png
AddSingleton:单例生命周期,在整个进程中获取的都是同一个实例
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816122-617829456.png
AddScoped:作用域生命周期(同一个作用域,获取的是同一个对象的实例,不同的作用域,获取的是不同的独对象实例)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813447-1909824494.png
建议:开发工作中,一般情况下,都是一个请求一个对象的实例,所以使用的是顺时声明周期(AddTransient)。
十一、Autofac容器
11.1-Autofac容器初识?
Autofac也是一款流行的IOC容器;
11.2-如何使用Autofac容器?
(1)管理Nuget程序包,下载并安装【Autofac】
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816041-531422953.png
(2)在【Startup.cs】的【ConfigureServices】中注册服务;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816363-579531361.png
11.3-Autofac注入方式-构造函数注入
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813599-805251338.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816505-1723257040.png
11.4-Autofac注入方式-属性注入
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813771-1668952581.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816204-549392431.png
11.5-Autofac注入方式-方法注入
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816506-285525326.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813790-484019567.png
11.6-Autofac生命周期-瞬时生命周期(默认)
瞬时生命周期:每一次获取对象都是一个全新的实例,默认的生命周期。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816497-1551700666.png
11.7-Autofac生命周期-单例生命周期
单例声明周期:在整个进程中,对象永远都是同一个实例(SingleInstance)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816298-1902878329.png
11.8-Autofac生命周期-每个生命周期范围一个实例
每个生命周期范围一个实例:同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样。(InstancePerLifetimeScope)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814139-1380847765.png
11.9-Autofac生命周期-每个匹配生命周期范围一个实例
语法:InstancePerMatchingLifetimeScope(名称)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816465-707965919.png
11.10-Autofac生命周期-每个请求一个实例
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816566-1189219975.png
11.11-Autofac支持配置文件
(1)管理Nuget包,引入3个程序集;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814024-763563110.png
(2)新建一个配置文件【autofac.json】,记得将配置文件设置为:始终复制到目录。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816465-1361320804.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816396-2126364996.png
(3)在【Startup.cs】的【ConfigureServices】中注册服务;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814092-860066860.png
11.12-Autofac整合MVC
注意:Autofac是一个第三方容器;
(1)指定Autofac工厂替换默认工厂,在【Program.cs】中的【CreateHostBuilder】方法中指定。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816302-1168026894.png
(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)通过控制器构造函数注入,获取实例。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816574-116048348.png
这种方法也还能用:
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814339-1290251507.png
11.13-Autofac支持控制器属性注入
(1)首先在【Startup.cs】中【ConfigureServices】方法中,指定控制器实例容器来创建,进行替换。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816543-1962998617.png
(2)创建一个类(特性);
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816535-1165878491.png
(3)创建一个类,用来判断维度;
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814507-1434557703.png
(4)在【Startup.cs】中创建一个【ConfigureContainer】方法,负责注册各种服务。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816414-1262488306.png
11.14-Autofac一个实例多实现的问题
注意:
[*]如果一个抽象多个实例,都注册了,通过构造函数用抽象类型来获取实例,哪个是后面注册的,就能获得哪个,覆盖类型的。
[*]如果一个抽象多个实例,都注册了,可以通过一个IEnumerable,当做构造函数参数,可以获取到左右注册的具体的实例。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816373-46390870.png
一般使用以下方法:
(1)在【Startup.cs】中创建的【ConfigureContainer】方法中,注册资源和实现(单抽象、多实现)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814597-668014779.png
(2)通过构造函数中,使用具体理性实理性做我参数,可以匹配到不同的具体类型实例。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816643-756895593.png
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816641-1810710875.png
(1)新建一个类,该类继承Module类,实现Load方法。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814684-404653462.png
(2)与之前相同,不同的而方式:在【Startup.cs】中创建的【ConfigureContainer】方法中,注册资源和实现(单抽象、多实现)
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816297-537557588.png
11.15-Autofac通过抽象(接口)支持AOP(面向切面编程-做应用型系统)
AOP-面向切面编程:不用修改之前代码的基础上,可以动态的在某个动作之前加一些操作,动态的在某一个动作之后做点什么事。
(1)管理Gurget程序包,下载【Castle.Core】包,该包用来动态代理。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816514-624065825.png
(2)创建一个类为【CustomAutofacAop】,该类继承自【IInterceptor】接口,并实现接口中的【Intercept】方法。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134814806-456738760.png
(3)在服务的抽象上面做一个标记,这个标记是用来:支持AOP扩展能够生效。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816115-213102318.png
(4)因为这个【CustomAutofacAop】实例也是通过Autofac的IOC来做的,所以需要在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务,让Autofac支持AOP。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816195-1012232270.png
11.16-Autofac通过类支持AOP
(1)管理Gurget程序包,下载【Castle.Core】包,该包用来动态代理。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813594-1788178556.png
(2)创建一个类为【CustomAutofacAopClass】,该类继承自【IInterceptor】接口,并实现接口中的【Intercept】方法。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816196-289784012.png
(3)在类上面做一个标记,这个标记是用来:支持AOP扩展能够生效。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816328-1533972812.png
(4)因为这个【CustomAutofacAop】实例也是通过Autofac的IOC来做的,所以需要在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务,让Autofac支持AOP。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813638-2063013797.png
11.17-Autofac单抽象多实现构造函数注入(MVC)
(1)在【Startup.cs】中创建的【ConfigureContainer】方法中,注册服务。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816484-1191282338.png
(2)在控制器中调用。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816050-1806346549.png
11.18-Autofac单抽象多实现属性注入
(1)道理和上面是一样的,可以吧Autofac上下文当做属性来注入。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134813698-2088896577.png
(2)在使用的时候,通过Autofac上下文+不同注册的标识,获取到不同的具体实例。
https://img2023.cnblogs.com/blog/3240243/202308/3240243-20230808134816604-883236498.png
上一篇:https://www.cnblogs.com/kimiliucn/p/17613434.html
原文地址:https://www.cnblogs.com/kimiliucn/p/17620153.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]