看大牛们的源码,对于水平一般的人,还是略微有点难度的。我从我自身读码的亲身体验,写下杂散片语,希望能和大家一同进步,也为了日后记忆上的备查。

先看的是brnMall的源码结构,从哪看起呢?

首先推荐看的肯定是官方的剖析:BrnShop开源网上商城第二讲:ASP.NET MVC框架

官方的这篇文章主要讲清楚了几点:

(1)brnshop设计时对网页环境上下文是如何获得,如何保存,并如何访问的(重载了控制器的基类,用于截获http访问时的预处理,身份授权和验证等问题),这些都是mvc程序自定义时惯用的方式。

(2)而为了便利地获得上下文,并自动转换对应类型,则需要重写mvc的WebViewPage页。这里可能一些读者会搞不清楚,这里涉及到对mvc底层的一些了解,我找了些资料看了看,才弄明白。资料url:ASP.NET MVC的Razor引擎:View编译原理

简单说:一个View最终也被编译成一个类,这个类的基类可以自定义为WebViewPage类的派生类,所以可以在这个派生类里完成上下文的类型转换,并替换为视图页面的基类。当然做自定义替换后,也要记得改相关的配置,让mvc用你自定义的视图页的派生类作为基类来生成页面。

(3)另外,讲一下,代码阅读时,该代码的划分放置。

(A) brnMall的Library中的brnMall.Data主要是数据库实体类(和各种表对象打交道),brnMall.Core主要是业务逻辑和辅助功能用到的接口和策略配置管理类(譬如:邮件接口和配置,订单接口和配置),brnMall.Service则是业务逻辑具体的实现

(B) 阅读变现层Presentatio时,重点是要读懂两点:

第一:框架上的自定义改造作者是怎么做的,在BrnMall.Web.Framework中,在Controller里对各个主页面模块的控制器基类做了派生,主要在派生类里完成了网页上下文信息的自动记录。这样当用户访问页面首页时,就能自动获取很多信息,譬如:浏览器类型,是否为移动设备的用户等等。在ViewPages里主要是做了对获取的上下文做了类型返回的自动转换。在Pager里主要对分页做了相关处理。在Validator中主要是封装了各种信息的合法性检查的逻辑和正则表达式的使用。而Theme这个主题风格的问题,目前还没深入读,后面再做分析。

第二:我们看代码时,一般会希望知道程序的起点和跳转的逻辑。我们知道mvc程序都是有启动项目的,BrnMall.Web就是启动项目,在它的Global.asax中为程序的起点。

namespace BrnMall.Web
{
public class BrnMallApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//将默认视图引擎替换为ThemeRazorViewEngine引擎
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new ThemeRazorViewEngine()); //注册所有的区域
/*AreaRegistration.RegisterAllAreas()是global.asax中调用的,它会找到所有的AreaRegistration的子类,
* 不管是在Web项目中,还是在其他类库项目中。所以我们在项目的Api文件夹中放一个AreaRegistration的子类,
* 也是能被找到的,然后在注册Area时,在参数中传递Controller所在的命名空间,问题就解决了。
*/
AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); //启动事件机制
BMAEvent.Start();
//服务器宕机启动后重置在线用户表
if (Environment.TickCount > 0 && Environment.TickCount < 900000)
OnlineUsers.ResetOnlineUserTable();
}
}
}

在这里启动时,BrnMall做了很多替换和设置,譬如:视图引擎,路由表的注册,这里还有一个重要的设置:AreaRegistration.RegisterAllAreas();

这句代码的作用是什么呢?它是在同一个解决方案里,不同的项目使用了不同的Areas,区域。而各个项目Area的跳转以及调用方式,都和area和路由的写法有关系。这是什么意思呢?举个例子:如果一个用户拿手机访问BrnMall,它是如何显示页面的呢,它首先在主area里,也就是BrnMall.Web的控制器HomeController的Index方法中

   /// <summary>
/// 首页控制器类
/// </summary>
public partial class HomeController : BaseWebController
{
/// <summary>
/// 首页
/// </summary>
public ActionResult Index()
{
//判断请求是否来自移动设备,如果是则重定向到移动主题
if (WebHelper.GetQueryInt("m") != && WebHelper.IsMobile())
return RedirectToAction("index", "home", new RouteValueDictionary { { "area", "mob" } }); //首页的数据需要在其视图文件中直接调用,所以此处不再需要视图模型
return View();
}
}

在这个方法中,判断了上下文是否为移动设备,如果是则跳转到移动项目的Area上的同名控制器的index方法上去。

//判断请求是否来自移动设备,如果是则重定向到移动主题
if (WebHelper.GetQueryInt("m") != 1 && WebHelper.IsMobile())
   return RedirectToAction("index", "home", new RouteValueDictionary { { "area", "mob" } });

这句代码就使用到了如何跳转Area,以及如何定义Area的知识。Area有两种定义方式,一种是在同一个项目中添加Area,另一种是在同一个解决方案的不同项目有不同的Area。

而BrnMall就是第二种结构,他在每一个非主Area,且有界面视图的项目里都有一个文件:AreaRegistration.cs文件,这个文件定义了AreaRegistration类的派生类,在这个派生类里指明了Area的名字和路由方法。最后,在程序的起点再通过调用AreaRegistration.RegisterAllAreas(); 就可以自动找到所有定义的Area和对应的路由方式。这就是另一处需要注意的事情。下面也给出了参考的网上文章。

.NET/ASP.NET MVC(模块化开发AraeRegistration)

MVC-RedirectToAction跳转到其他Area

今天先写到这吧,下次我们来读读nopCommerce的起点结构分析,有点压力,因为感觉那个代码比较难,尽力吧!

愿意交朋友的可以加我QQ:9200118

(2)dotnet开源电商系统-brnshop VS nopCommerce(dotnet两套电商来PK--第二篇:代码从哪开始-BrnMall3.0Beta)的更多相关文章

  1. (1)dotnet开源电商系统-brnshop&brnMall 和老外开发的nopCommerce(dotnet两套电商来PK--第一篇)

    一直想做电商软件,但是实在不想学PHP了,所以前后关注了这两个开源电商系统.一个是国人出品的,一个据说是俄罗斯人写得(不知道对不对).目前两个开源软件都在学习了解中,以下的博文可能会涉及到这两套系统, ...

  2. 电商系统的演变可以看出架构演变 Dubbo入门 远程过程调用 需要解决的问题

    Dubbo入门---搭建一个最简单的Demo框架 - CSDN博客 https://blog.csdn.net/noaman_wgs/article/details/70214612 Dubbo背景和 ...

  3. 集DDD,TDD,SOLID,MVVM,DI,EF,Angularjs等于一身的.NET(C#)开源可扩展电商系统–Virto Commerce

    今天一大早来看到园友分享的福利<分享一个前后端分离方案源码-前端angularjs+requirejs+dhtmlx 后端asp.net webapi>,我也来分享一个吧.以下内容由笔者写 ...

  4. 电商系统架构总结1(EF)

    最近主导了一个电商系统的设计开发过程,包括前期分析设计,框架搭建,功能模块的具体开发(主要负责在线支付部分),成功上线后的部署维护,运维策略等等全过程. 虽然这个系统不是什么超大型的电商系统 数亿计的 ...

  5. CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业基于微信公众号、小程序实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发、分销、等各种业务需求。

    **可以快速二次开发的开源小程序商城系统源码**源码开源地址:https://github.crmeb.net/u/LXT 项目介绍: CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业 ...

  6. SpringBoot+Security+MyBatis+ES+MQ+Redis+Docker+Vue的电商系统

    今天鹏哥给大家推荐的项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现. 前台商城系统包含首页门户.商品推荐.商品搜索.商品展示.购物车.订单流程.会员中 ...

  7. 手把手教你使用VUE+SpringMVC+Spring+Mybatis+Maven构建属于你自己的电商系统之vue后台前端框架搭建——猿实战01

            猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...

  8. 免费领CRMEB移动社交电商系统源码与授权

    移动电商风起云涌,直播带货重塑销售模式,传统商业更是举步维艰,各行各业转型移动电商迫在眉睫,拥有一款好的移动社群社交电商系统成为众多企业与商家的心病! 你曾是否被那些劣质的移动电商系统搞得心力憔悴? ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

随机推荐

  1. random随机库

    random库是用于产生并运用随机数的标准库 主要包含的有9个随机函数,分别是: seed(), random(), randint(), getrandbits(), randrange(), un ...

  2. (44). Spring Boot日志记录SLF4J【从零开始学Spring Boot】

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增 ...

  3. Ajax 请求之_请求类型详解

    $.ajax({ url: "规定发送请求的 URL.默认是当前页面.", type: "post", // 请求类型,默认get // 在回调函数中,无需将j ...

  4. [bzoj4796][CERC2016]Key Knocking_乱搞

    Key Knocking bzoj-4796 CERC-2016 题目大意:描述没有题面短系列..题目链接 注释:$1\le n\le 10^5$. 想法: 乱搞稳AC.考试的时候调试信息又一次杀死了 ...

  5. js 实现栈的结构

    js实现一个栈的数据结构 首先了解一下什么是栈,栈是一个后进先出的一种数据结构,执行起来效率比较高. 对于栈主要包括一些方法,弹出栈pop(),弹出栈顶元素,并删除该元素:压入栈push(),向栈中压 ...

  6. 洛谷 P1479 宿舍里的故事之五子棋

    P1479 宿舍里的故事之五子棋 题目描述 宿舍里好多好多有趣的事! 7890653今天看到不知何时流行的五子棋,在宿舍里拿个本子,画一些格子,一个棋盘就做好了! 当7890653把目光放到棋上,突发 ...

  7. Tween公式

    Tween公式 4个参数 t:current time(当前时间) b:beginning value(初始值) c: change in value(变化量) d:duration(持续时间) re ...

  8. java package 命名空间

    原文: http://www.studytonight.com/java/package-in-java.php 创建一个简单的maven 项目的命令是: mvn  archetype:generat ...

  9. HDU 5294 Tricks Device(多校2015 最大流+最短路啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...

  10. CAS 4.0 配置开发手冊

    1    下载 地址http://downloads.jasig.org/ cas-server-4.0.0-release.tar.gz cas-client-3.3.3-release.tar.g ...