.Net Core应用框架Util介绍(三)

 上篇.Net Core应用框架Util介绍(二)介绍了Util的开发环境,并让你把Demo运行起来。本文将介绍该Demo的前端Angular运行机制以及目录结构。

 

目录结构

    在VS上打开Util Demo,会看见如下的目录结构。

640?wx_fmt=png  

  现代前端通常采用VS Code开发,不过我们为了使用TagHelper,需要采用VS开发,这为你提供了更多的选择。 

  你可以将WebApi和Angular应用放在同一个项目中,就像现在看见的那样。也可以分别把WebApi和Angular应用放到不同项目中。 

  如果你已经习惯了VS Code开发,这同样没问题,不过你将放弃TagHelper带来的强类型代码提示和编译时检查特性。 

  对于Angular,它提供了ng cli命令行工具,你可以用ng cli来创建项目结构。

  前文已简要介绍了TagHelper,它是用来提升Angular视图页面开发效率的利器。为了使用TagHelper,不得不放弃ng cli,因为它不支持在Angular组件上配置服务端动态地址。

  下面介绍这个项目中包含的目录和文件。

 

Apis目录

  这个目录用来存放Web Api控制器。

640?wx_fmt=png

  ApplicationController演示了普通CRUD操作,RoleController演示了树型层次的CRUD操作。

  你暂时不要关心Web Api CRUD操作,我会在后续介绍。

 

 Areas目录

640?wx_fmt=png

   用过Asp.Net Mvc的同学可能知道,Areas就是区域,它的作用是提供模块化管理。我们把不同的模块用Areas的区域分隔开,这样在项目规模变大时,还能迅速找到相关页面。

  与传统Asp.Net Mvc应用不同,Util的Areas控制器并不进行任何操作,只是简单的返回视图页面,cshtml仅起到代码生成器的作用。

  一个更好的选择是使用RazorPage,它把控制器和页面合并了,将来会使用这种方式。 

Configs目录

   你并不需要它,我在Demo中用来放测试配置,项目上我通常把Configs目录放在应用层类库。

Controllers目录

   Controllers目录是用来放置与首页相关的控制器。

Datas目录  

  Util引入了DDD经典架构,Datas位于基础设施层,一些人把它叫仓储层。

  Datas通常放在单独的类库,为了演示简单,我放在该WEB项目的目录中。

DbScripts目录

  这个目录提供了Sql Server建库脚本。

  一些人可能很惊讶,什么年代了,还在使用Db First开发。

  在多年的开发实战中,我摸索到一套以PowerDesigner数据建模配合CodeSmith代码生成的开发模式。对于CRUD,它具有快速高效的特点,同时你还能拥有清晰的数据字典以供未来查阅。

  对于具备面向对象编程能力的人,这种方式并不会降低代码质量和设计水平,在将代码生成出来以后,通过手工调整就可达到与Code First相同的代码水平。

  我会在未来某个合适的时候介绍这种开发模式。

 Domains目录

  DDD经典架构中领域层相关的目录,实际开发中将放到单独的类库。

Services目录

  DDD经典架构中应用层相关的目录,实际开发中将放到单独的类库。

Typings目录

   Angular相关的所有东西都在这里。

640?wx_fmt=png

 

  app目录用来存放与业务相关的项目资源,比如Angular组件,指令,服务等。

  值得注意的是,该目录包含组件对应的.html文件,这些.html文件和.cshtml文件是怎样的关系?

 640?wx_fmt=png

 

  如果你从未运行过Util Demo项目,打开app目录,并未找到任何.html文件。

  你可能已经猜到了,.html文件是由.cshtml文件生成的

  你永远都不应该手工编辑这些.html文件,因为在调试运行时将被覆盖。 

  test目录包含Ts单元测试,我仅对极少数Helper进行单元测试。通过下面的npm命令把测试运行起来。

npm test

640?wx_fmt=png

 

  util目录包含对Angular常用API和Angular Material组件的封装。

  640?wx_fmt=png

 

  Angular组件由视图和控制器两部分构成。视图即模板页,包含html标签。控制器用来编写逻辑,包含Ts代码。换句话说,Angular应用开发主要是编写html和ts(当然还有css,暂时不要管它)。

  TagHelper并不是Util封装Angular的唯一手段,对于Angular控制器,Util采用链式封装手法,将Angular常用Api封装得更加简单易用,使你对Angular Api只要有一个模糊的印象就可以开发了。

  对于Angular视图页面,并不能直接采用TagHelper简单包装,这样会导致TagHelper过于复杂,另外很多功能需要在运行时进行判断,TagHelper只在开发调试阶段存在,所以采用两层封装会更加省力。

  首先采用Angular组件或指令对Material组件进行封装,然后采用TagHelper提供强类型提示。  

  对于希望采用VS Code开发的同学,Typings/util目录中封装的代码同样可以使用,它跟TagHelper没有什么关系,你可以把它Copy到你的项目,我尚未把它发布到npm。 

Views目录

  Views目录包含首页。

appsettings.json文件

  它是一个配置文件,数据库连接字符串在这里。

nlog.config文件

  它是NLog日志组件的配置文件,Util 采用NLog输出开发调试和错误日志,默认位置是c:\log目录。

package.json文件

  它是npm包管理器的配置文件。

Program.cs文件

  它是Asp.Net Core程序入口点文件。

Startup.cs文件

  它是Asp.Net Core启动文件,在这里配置依赖注入和中间件请求管道。

tsconfig.json文件

  它是Typescript语言配置文件。

webpack.config.js文件

  它是Webpack自动化构建工具的配置文件。

  还有两个配置文件隐藏在webpack.config.js下,它们对util和第三方Js框架进行处理。

640?wx_fmt=png

 

运行机制

  对于没有前端基础的同学,可能很难理解这个Demo是如何运行起来的,下面为你介绍这个Demo的运行机制,我们从npm包还原开始。 

 npm还原

  当你输入yarncnpm install node-sass,它会找到package.json文件的dependencies节,然后把需要的文件下载到node_modules目录中。

 执行Webpack构建

  然后输入npm run dev,这里发生了什么?

  npm run是npm的一个命令,它会查找package.jsonscripts定义的命令。

640?wx_fmt=png

 

  • npm run dev 

  dev就是npm run要查找的命令名,它是一个约定俗成的名称,代表开发阶段配置,即develop,当然你不一定用这个名字,叫abc也可以。

  npm run dev查找到package.json文件scripts节定义的dev命令,它的内容是npm run vendor && npm run app,这个命令是由两个npm run命令组成的。

  •  npm run vendor

  npm run vendor的内容是webpack --config webpack.config.vendor.js,这将对webpack.config.vendor.js执行构建操作。

  webpack命令默认查找webpack.config.js文件,现在要查找的是webpack.config.vendor.js,所以需要添加参数—config。

  我们来看看webpack.config.vendor.js包含什么内容。 

640?wx_fmt=gif webpack.config.vendor.js

  vendorJs 对象用于配置将哪些第三方Js框架文件进行打包,vendorCss 对象用于配置需要打包的第三方框架提供的Css文件。 

  entry属性指定了需要打包的入口文件,output属性则指定输出的位置和文件名。 

  当webpack.config.vendor.js执行完毕,会在Util.Samples.Webs项目的wwwroot目录创建一个dist子目录,并生成vendor.jsvendor.css两个文件。

  注意vendor.js仅在开发调试阶段使用,所以并没有对它进行压缩,正式发布并不需要执行vendorJs对象。

  该脚本的最后一行证明了这一点。

return isDev ? [ vendorJs, vendorCss] : [vendorCss];
  •  npm run app 

  npm run app又包含两个命令,用于执行webpack.config.util.jswebpack.config.js

webpack --config webpack.config.util.js && webpack

  先来看看webpack.config.util.js

640?wx_fmt=gif webpack.config.util.js

  它将查找Util.Samples.Webs项目下Typings/util/index.ts文件,这是util默认导出文件,所有在外部需要访问的类型都会从这里导出。

  当webpack.config.util.js执行完毕,会在dist目录创建util.js文件。

  同样的,util.js文件仅用于开发调试阶段 

  下面看webpack.config.js

640?wx_fmt=gif webpack.config.js

  webpack.config.js查找Typings目录下的main.ts,main.ts是angular项目的入口文件。

  webpack通过递归依赖查找main.ts,将除了util.js和vendor.js以外所有引用到的ts或js文件打包到dist/app.js文件中。

  注意,正式发布时,app.js将采用angular官方提供的webpack编译插件@ngtools/webpack进行AOT编译并打包生成。

640?wx_fmt=png

 

  现在dist目录生成了如下文件。

640?wx_fmt=png

  0.chunk.js是由angular子模块生成的js文件,当路由配置对子模块启用了延迟加载,每个子模块都会生成一个独立的js文件。

640?wx_fmt=png

 

  loadChildren以延迟加载的方式来配置SystemModule子模块。

 运行机制

  现在运行angular应用的js文件已经就绪,让我们把它运行起来,在VS上F5启动项目。 

  注意:你应该使用Google Chrome来打开它,IE浏览器,可以通过启用polyfill来勉强支持,不过由于效果不佳,我已经把它扔掉了。 

  当浏览器打开首页http://localhost:5200,Asp.Net Core启动文件Startup.cs中配置的默认路由将被激活,从而将请求发送到HomeController控制器的Index方法。

640?wx_fmt=png640?wx_fmt=png

   Index方法直接返回了Views目录下Index.cshtml首页。

640?wx_fmt=png

 

  environment标签是一个环境判断条件,用于设置开发及上线等不同阶段的内容。

  <environment include="Development">用于开发阶段,<environment exclude="Development">用于发布阶段,可以看出,在发布后并不需要vendor.js和util.js文件,因为app.js会包含它们。 

  好,现在浏览器加载了Index首页,Angular应用是如何运行起来的呢?

  • Angular的引导过程

   还记得Angular应用入口文件main.ts吗,来看看它包含什么内容。

 640?wx_fmt=png

  platformBrowserDynamic是为浏览器平台提供的JIT动态编译服务,它将引导AppModule根模块的启动。

  AppModule是Angular应用的根模块,它的主要任务之一就是启动AppComponent根组件。

640?wx_fmt=png

  AppComponent是整个Angular应用的根组件,所有其它组件都将被加载到根组件中。

640?wx_fmt=png

 

  selector用于指定组件的自定义标签,这里将根组件标签定义为<app></app>,你发现它已经被放置在Index.cshtml中。 

  AppComponent根组件准备启动了,由于是JIT编译,所以它需要获取视图 

  组件的视图由templateUrl属性指定。

templateUrl: env.prod() ? './app.component.html' : '/home/main'

  我们希望开发阶段通过访问服务端控制器来获取视图,这样在编辑TagHelper时就能更方便,只需刷新页面就能看见效果。 

  env是一个环境检测对象,prod方法如果返回true表明当前为正式环境,将从app.component.html静态文件获取视图,如果是开发调试环境,则访问服务端HomeController控制器的Main方法获取视图。 

640?wx_fmt=png

  Main方法上的Html特性,是用来帮助.cshtml生成.html静态文件的辅助工具。 

  一般情况下,你并不需要手工设置Html特性来生成html文件,Util提供了ViewControllerBase控制器基类,当你的视图控制器继承它,所有html文件就会生成到约定的目录中。

 640?wx_fmt=png

  由Template属性设置的路径可知,Typings/app中的项目结构也采用模块化组织,与区域模块相对应。

   现在来看根组件的视图。

640?wx_fmt=png

   这是你第一次看见Util封装的TagHelper标签,以<util-打头的标签都是Util TagHelper,它们以粗体显示,这是由于安装了Resharper的原因。

  TagHelper在运行时会把html输出到页面,它们把弱类型的html封装成了具有强类型提示的标签。

  如何知道某个TagHelper到底输出了什么html呢?

  一种办法是打开它生成的.html文件来查找,不过当页面很复杂时,这种办法有点吃力。

  另一种办法是查看日志,Util TagHelper的每个组件都提供了write-log属性,当设置为true,就会在C盘log目录生成日志。

 640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

  main.cshtml视图中最关键的部分就是<router-outlet></router-outlet>标签。

  router-outlet是Angular路由的占位符,当根模块AppModule中配置的路由激活时,相关的Angular组件就会被放进这个占位符中。

  根模块中的路由配置被拆分到一个单独的模块AppRoutingModule中,路由配置如下。

 640?wx_fmt=png

  通过路由配置可以发现,当打开首页时,命中路由第二项path:’’,会跳转到/systems/application路径,systems是一个子模块,我们来查看它的路由配置。

 640?wx_fmt=png

640?wx_fmt=png

 

  /systems/application将激活ApplicationIndexComponent组件,并把它加载到根组件的<router-outlet></router-outlet>中。

  ApplicationIndexComponent组件请求服务端地址/view/systems/application获取视图。

640?wx_fmt=png

 

   /view打头的地址将匹配到Areas区域控制器,这是在MVC路由配置中设置的。

 640?wx_fmt=png

  控制器ApplicationControllerIndex方法将返回视图。

 640?wx_fmt=png

  Angular JIT编译会在系统启动时请求服务端URL,在Chrome浏览器F12调出开发者工具,刷新页面,会观察到页面请求了Areas中的控制器。

640?wx_fmt=png

  

  所以你在开发阶段运行项目会感觉比较慢,在正式发布后就没这些开销了。

小结  

  本文简要介绍了Util Demo的目录结构和运行机制,如果你没有Angular基础,估计还是很难看懂,建议你阅读Angular中文网https://angular.cn。  

  未完待续,下一篇将对Util Demo的Angular封装进行介绍,本来是准备这篇介绍的,不过限于篇幅,放到下篇,我知道,太长的文章既难写更难读。

  写文需要动力,请大家多多支持,点下推荐,Github点下星星。

  Util应用框架交流一群: 24791014

相关文章:

  • .Net Core应用框架Util介绍(一)

  • .Net Core应用框架Util介绍(二)

原文地址:https://www.cnblogs.com/xiadao521/p/Util-Introduction-3.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ocelot简易教程(三)之主要特性及路由详解

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9664977.html上篇《Ocelot简易教程&#xff08;二&#xff09;之快速开始2》教大家如何快速跑起来一个ocelot实例项目&#xff0c;也只是简单的对Ocelot进行了配置&#xff0c;这篇文章会给大家详…

Poj 3070 Fibonacci

Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26063 Accepted: 17394文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Poj 3070 FibonacciDescription In the Fibonacci integer sequence, F0 0, F1 1, and Fn Fn − 1 Fn − 2 for…

生成函数化简技巧

一些重要式子 ∑i0∞xi11−x\sum_{i0}^{\infty}x^i\frac{1}{1-x}∑i0∞​xi1−x1​ 推论&#xff1a; 11−ax∑i0∞aixi\frac{1}{1-ax}\sum_{i0}^{\infty}a^ix^i1−ax1​∑i0∞​aixi 11−xk∑i0∞xik\frac{1}{1-x^k}\sum_{i0}^{\infty}x^{ik}1−xk1​∑i0∞​xik 11−cxk∑i0∞…

.NET西安社区 [拥抱开源,又见 .NET] 活动简报

拥抱开源, 又见 .NET」随着 .NET Core的发布和开源&#xff0c;.NET又重新回到了人们的视野。除了开源、跨平台、高性能以及优秀的语言特性&#xff0c;越来越多的第三方开源库也出现在了Github上——包括ML.NET机器学习、Xamarin移动开发平台、基于Actor模型的分布式框架Orlea…

dotnet core高吞吐Http api服务组件FastHttpApi

简介是dotNet core下基于Beetlex实现的一个高度精简化和高吞吐的HTTP API服务开源组件&#xff0c;它并没有完全实现HTTP SERVER的所有功能&#xff0c;而是只实现了在APP和WEB中提供数据服务最常用两个指令GET/SET&#xff0c;满足在应用实现JSON,PROTOBUF和MSGPACK等基于HTTP…

ASP.NET Core 中的中间件

前言由于是第一次写博客,如果您看到此文章,希望大家抱着找错误、批判的心态来看。 sky!何为中间件?在 ASP.NET Framework 中应该都知道请求管道。可参考&#xff1a;浅谈 ASP.NET 的内部机制 系列&#xff0c;个人感觉超详细。题外话&#xff1a;说到请求管道&#xff0c;就想…

.NET Core中的性能测试工具BenchmarkDotnet

背景介绍之前一篇博客中&#xff0c;我们讲解.NET Core中的CSV解析库&#xff0c;在文章的最后&#xff0c;作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能&#xff0c;本篇我们来详细介绍一下BenchmarkDotNet。原文链接&#xff1a;https://dotnetco…

some useful tricks

异或题思考方向&#xff1a;01trie树&#xff0c;分治 2. 二分图最大匹配&#xff0c;最大独立集互相转换 3. Snow 4. Code 5. Code 6. Code 7. 题目 #include<iostream> #include<cstdio> using namespace std; const int N100010; int n,p,nxt[N],no[200]…

25大技术主题向您发出最后一次约【惠】邀请

一年一度的微软技术盛会即将在上海世博中心拉开大幕金秋十月&#xff0c;来自两岸三地的百名明星讲师将携 25 大技术主题&#xff0c;齐聚上海为您奉献一场无与伦比的技术视听盛宴您&#xff0c;准备好了吗&#xff1f;25大技术主题公开&#xff0c;不负期待姗姗来迟的5系25大技…

分布式系统消息中间件——RabbitMQ的使用基础篇

前言我是在解决分布式事务的一致性问题时了解到RabbitMQ的&#xff0c;当时主要是要基于RabbitMQ来实现我们分布式系统之间对有事务可靠性要求的系统间通信的。关于分布式事务一致性问题及其常见的解决方案&#xff0c;可以看我另一篇博客。提到RabbitMQ&#xff0c;不难想到的…

小a的旅行计划

来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 小a终于放假了&#xff0c;它想在假期中去一些地方…

吃豆人(luogu 7472/NOI Online 2021 普及组 T2)

正题 luogu 7472 题目大意 给出一个正方形点阵&#xff0c;让你选择两个点&#xff0c;分别向两个方向移动&#xff08;必须是45度&#xff09;&#xff0c;每到一个点就得到该点的贡献&#xff08;不重复得&#xff09;&#xff0c;遇到墙壁反射&#xff0c;问你最大贡献 解…

在 Centos7 用Jexus服务器 运行.Net Core 只需几步

安装 .Net SDK 不需要按照 .net core runtime,sdk 依赖于运行时会自动安装第一步 添加dotnet源sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm第二步 安装 .Net Core可能由于网络原因&#xff0c;下载要耐心等待一段时间,下载完成后…

小球碰撞(理解ing)

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 一个弹球&#xff08;可视为质点&am…

.Net思想篇:为何我们需要思想大洗礼?

前言每当说一件事的时候&#xff0c;我喜欢回溯往事&#xff0c;这样思有所依&#xff0c;文有所凭&#xff0c;才能达到打字如尿崩&#xff0c;一发不可收拾的流畅度。让我们将时光回溯到08年&#xff0c;当时和同学们就有了学java和.net之争&#xff0c;当然不止这些&#xf…

[AGC009B] Tournament(多叉树转二叉树后的最小可能深度)

传送门 把aia_iai​看成faifa_ifai​&#xff0c;建出一棵多叉树&#xff0c;再把多叉树转成二叉树&#xff0c;转出来的每棵二叉树对应着一种比赛方式。 以n8,a2,...,81,1,2,4,3,3,3n8,a_{2,...,8}1,1,2,4,3,3,3n8,a2,...,8​1,1,2,4,3,3,3为例&#xff0c; 多叉树转出的二…

C# 8中的Async Streams

关键要点异步编程技术提供了一种提高程序响应能力的方法。Async/Await模式在C# 5中首次亮相&#xff0c;但只能返回单个标量值。C# 8添加了异步流&#xff08;Async Streams&#xff09;&#xff0c;允许异步方法返回多个值&#xff0c;从而扩展了其可用性。异步流提供了一种用…

asp.net core webapi项目配置全局路由

一、前言在开发项目的过程中&#xff0c;我新创建了一个controller&#xff0c;发现vs会给我们直接在controller头添加前缀&#xff0c;比如[Route("api/[controller]")],即在访问接口的时候会变成http://localhost:8000/api/values&#xff0c;但是如果控制器有很多…

C Looooops POJ - 2115

C Looooops POJ - 2115 题目&#xff1a; A Compiler Mystery: We are given a C-language style for loop of type statement; I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing …

IdentityServer4实战 - 谈谈 JWT Token 的安全策略

一.前言众所周知&#xff0c;IdentityServer4 默认支持两种类型的 Token&#xff0c;一种是 Reference Token&#xff0c;一种是 JWT Token 。前者的特点是 Token 的有效与否是由 Token 颁发服务集中化控制的&#xff0c;颁发的时候会持久化 Token&#xff0c;然后每次验证都需…