Nopcommerce架构浅谈之文件结构
应该是在两年前了,在拜读园子里大神的文章时偶然了解到有个叫NopCommerce的商城系统,苦于没有时间,各种耽误,其中研究过一段时间,也就是一个星期时间,后来又耽搁了,直到最近,随着项目进入间歇期,终于有时间好好的研究下nop的代码了,作为优秀的.net B2C商城系统,从系统的架构设计角度出发,具有很强的拓展性,结合DDD思想,我觉得可以对系统有更深入的了解。
今天我就简单的先将系统解决方案中的项目做拆解,并附上自己的理解。我这里使用的是3.7版本的源码,官方目前到3.8,整体应该差别不大,可以到官网查看http://www.nopcommerce.com
从四个文件夹说起:
一、Libraries
这里存放了大量的领域层服务、领域事件、基础设施等,可以说是整个系统的最核心,我的理解是即使没有展示层,这里的所有的功能也是完整的,换句话说,如果我将整个系统开发成API,这里地方不需要做额外的改动,只需要api程序调用这里的相关功能就可以实现,绝对的松耦合。
- Nop.Core项目

文件没有显示齐全,但是可以大概看到,这个项目里存放了大量的通用支撑功能,用ddd的话讲应该就叫通用支撑子域,还包括了基础设施,领域类等。
- Nop.Data项目

这个项目里是同数据库做交互操作的数据层,在ddd里属于基础设施一部分,也可以单独拎出来,以后换数据库也不是难事。
- Nop.Service项目

领域服务,主要进行领域逻辑的实现。这个层的客户只有应用层,那么应用层在哪里?就在展示层中。其实这个里面并不包括web技术所特有的一些领域逻辑实现,就像我开始讲的,web的领域逻辑实现在展示层中的web框架项目中。
二、Plugins 插件机制是nop系统的一个很大的特色,不需要对系统做二次开发,可以灵活的开发出各种插件应用于系统。这个文件夹下面防止了大量的插件项目。
从名字就可以看出来了,有支付插件,有留言簿插件,有各种打折促销插件,这个以后再细说。
二、Presentation 展示层面,分为后台管理admin项目,前台web项目,web框架项目,他的绝妙之处在于将web框架从领域逻辑层剥离,就像刚才上面所讲的,可以将libraries里的服务单独拿出来用,没有任何的违和。



这里重点说下Framework,它是对Nop.Service的补充,重点在于对web程序的应用功能进行领域服务的深入。
四、Tests 大量的测试项目,这个在老外写的规范的项目里都是必须存在的,但是在国内,猿们为了更快的完成老板交代的任务,基本不会去做单元测试,唉。。。其实这个是绝对好,可以节省大量的时间。

后面我将逐个进行分析,对于nopcommerce,我的目标不是改装他,而是更多的学习先进的开发思维,一定要结合ddd思想。
Nopcommerce架构浅谈之文件结构的更多相关文章
- Nopcommerce架构浅谈之架构层次
前面谈到了系统的文件,从文件结构中我们也可以看出Nop的层次划分还是非常清晰,下面我将介绍下Nop的架构层次,并对每个层做简要的介绍,先看我画的层次图. 这个系统基本上按照了ddd的形式做了划分,我本 ...
- 基于puppet分布式集群管理公有云多租户的架构浅谈
基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍 在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...
- iOS应用架构浅谈
(整理至http://www.cocoachina.com/ios/20150414/11557.html) 缘由 从事iOS工作一年多了,主要从事QQ钱包SDK开发和财付通app维护,随着对业务的慢 ...
- JavaWeb应用开发架构浅谈
本文就我所经历和使用过的技术和框架, 讨论 Java / Javascript 技术组合构成的Web 应用架构. 一. 概述 Web 应用架构可以划分为两大子系统:前端子系统和后台子系统. 前端子系统 ...
- iOS 应用架构浅谈
当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: 简单来说就是调API,展示页面,然后跳转到别的地方再调API,再展示页面. App确实就 ...
- Linux架构浅谈
以下图为基础: 最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等.硬件是物质基础,而应用提供服务.但在两者之间,还要经过一番周折. 还 ...
- C++插件架构浅谈与初步实现
一.插件架构初步介绍 想到写本博客,也没想到更好的名字,目前就先命这个名吧.说到插件架构,或许大部分IT从业者都听过或者某些牛人也自己实现过稳定高效的插件框架.目前有很多软件以及库都是基于插件架构,例 ...
- Docker 基础底层架构浅谈
docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...
- spring boot架构浅谈
首先来说一下什么是spring boot架构 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置 ...
随机推荐
- bzoj3065: 带插入区间K小值
无聊来写了下 一开始发现树高是O(n)的,然后就MLE了,进去看了下发现没有重构! 看了半天发现调用错了函数 然后进去又发现不满足sz = ch[0]->sz + ch[1]->sz + ...
- delphi TSaveDialog
TSaveDialog 预览 实现过程 动态创建和使用保存文件对话框 procedure TForm1.Button1Click(Sender: TObject);begin wi ...
- Python3.x爬虫教程:爬网页、爬图片、自己主动登录
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 摘要:本文将使用Python3.4爬网页.爬图片.自己主动登录.并对HTTP协议做了一个简单 ...
- gitlab hooks
之前一直用文件同步工具进行两台服务器之间的同步 最初的目的是吧gitlab的代码库同步到开发环境中运行 实时的 ,后来由于gitlab的代码仓库的代码不是实时的 于是在即使同步不适合 我的需求. 后来 ...
- 改变Android按钮背景颜色的高效方法
本文将介绍一种有效改变Android按钮颜色的方法. 按钮可以在状态改变时改变其颜色(例如按下,禁用,高亮显示).但是,这需要一一说明每个状态.这篇文章将提供你一个根据状态变化轻松改变按钮颜色的方法. ...
- location.href的用户总结
*.location.href 使用方法: top.location.href="url" 在顶层页面打开url(跳出框架) self.location.href ...
- eclipse 上安装systemgui
http://wiki.eclipse.org/Linux_Tools_Project/PluginInstallHelp http://wiki.eclipse.org/Linux_Tools_Pr ...
- Linux PATH变量的设置
一般Linux系统,有两个配置文件可以设置PATH变量,一:.bashrc 二:.bash_profile; 还有一种方法可以临时设置PATH变量(三) 一: 1.编辑.bashrc,添加 expo ...
- java的各个队列之间的联系和区别是什么
java的各个并发队列之间的联系和区别 java.util.concurrent是在并发编程中很常用的实用工具类 ArrayBlockingQueue, DelayQueue, LinkedBlock ...
- 项目中常用SQL语句总结
1.项目中常常需要修改字段长度,但需要保留数据--增加业务受理 项目名称 字段长度alter table t_ywsl add aa varchar2(200);update t_ywsl set a ...