应该是在两年前了,在拜读园子里大神的文章时偶然了解到有个叫NopCommerce的商城系统,苦于没有时间,各种耽误,其中研究过一段时间,也就是一个星期时间,后来又耽搁了,直到最近,随着项目进入间歇期,终于有时间好好的研究下nop的代码了,作为优秀的.net B2C商城系统,从系统的架构设计角度出发,具有很强的拓展性,结合DDD思想,我觉得可以对系统有更深入的了解。

今天我就简单的先将系统解决方案中的项目做拆解,并附上自己的理解。我这里使用的是3.7版本的源码,官方目前到3.8,整体应该差别不大,可以到官网查看http://www.nopcommerce.com

从四个文件夹说起:

  一、Libraries

这里存放了大量的领域层服务、领域事件、基础设施等,可以说是整个系统的最核心,我的理解是即使没有展示层,这里的所有的功能也是完整的,换句话说,如果我将整个系统开发成API,这里地方不需要做额外的改动,只需要api程序调用这里的相关功能就可以实现,绝对的松耦合。

  1. Nop.Core项目

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

  2. Nop.Data项目

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

  3. Nop.Service项目

领域服务,主要进行领域逻辑的实现。这个层的客户只有应用层,那么应用层在哪里?就在展示层中。其实这个里面并不包括web技术所特有的一些领域逻辑实现,就像我开始讲的,web的领域逻辑实现在展示层中的web框架项目中。

  二、Plugins   插件机制是nop系统的一个很大的特色,不需要对系统做二次开发,可以灵活的开发出各种插件应用于系统。这个文件夹下面防止了大量的插件项目。

从名字就可以看出来了,有支付插件,有留言簿插件,有各种打折促销插件,这个以后再细说。

   二、Presentation   展示层面,分为后台管理admin项目,前台web项目,web框架项目,他的绝妙之处在于将web框架从领域逻辑层剥离,就像刚才上面所讲的,可以将libraries里的服务单独拿出来用,没有任何的违和。

  这里重点说下Framework,它是对Nop.Service的补充,重点在于对web程序的应用功能进行领域服务的深入。

  四、Tests  大量的测试项目,这个在老外写的规范的项目里都是必须存在的,但是在国内,猿们为了更快的完成老板交代的任务,基本不会去做单元测试,唉。。。其实这个是绝对好,可以节省大量的时间。

后面我将逐个进行分析,对于nopcommerce,我的目标不是改装他,而是更多的学习先进的开发思维,一定要结合ddd思想。

Nopcommerce架构浅谈之文件结构的更多相关文章

  1. Nopcommerce架构浅谈之架构层次

    前面谈到了系统的文件,从文件结构中我们也可以看出Nop的层次划分还是非常清晰,下面我将介绍下Nop的架构层次,并对每个层做简要的介绍,先看我画的层次图. 这个系统基本上按照了ddd的形式做了划分,我本 ...

  2. 基于puppet分布式集群管理公有云多租户的架构浅谈

    基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍   在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...

  3. iOS应用架构浅谈

    (整理至http://www.cocoachina.com/ios/20150414/11557.html) 缘由 从事iOS工作一年多了,主要从事QQ钱包SDK开发和财付通app维护,随着对业务的慢 ...

  4. JavaWeb应用开发架构浅谈

    本文就我所经历和使用过的技术和框架, 讨论 Java / Javascript 技术组合构成的Web 应用架构. 一. 概述 Web 应用架构可以划分为两大子系统:前端子系统和后台子系统. 前端子系统 ...

  5. iOS 应用架构浅谈

    当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: 简单来说就是调API,展示页面,然后跳转到别的地方再调API,再展示页面. App确实就 ...

  6. Linux架构浅谈

    以下图为基础: 最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等.硬件是物质基础,而应用提供服务.但在两者之间,还要经过一番周折. 还 ...

  7. C++插件架构浅谈与初步实现

    一.插件架构初步介绍 想到写本博客,也没想到更好的名字,目前就先命这个名吧.说到插件架构,或许大部分IT从业者都听过或者某些牛人也自己实现过稳定高效的插件框架.目前有很多软件以及库都是基于插件架构,例 ...

  8. Docker 基础底层架构浅谈

    docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...

  9. spring boot架构浅谈

    首先来说一下什么是spring boot架构 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置 ...

随机推荐

  1. ADB server didn't ACK的问题

    今天出现eclipse用手机调试时,一直起不来,出现ADB server didn't ACK,提示restart adb或者重启eclipse,按照原来的,查看了任务管理器中,没发现已经启动的adb ...

  2. 字符串、十六进制、byte数组互转

    import java.io.ByteArrayOutputStream; public class HexUtil { /** * @param args */ public static void ...

  3. [CF 351B]Jeff and Furik[归并排序求逆序数]

    题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...

  4. Codeforces Round #387(div 2)

    A =w= B VOV C QoQ D 题意:贝尔兰冬天很冷,那么司机要换上冬天专用轮胎才能开车.假设冬天一共有n天,有一套冬天专用轮胎,仅能使用k天,这套轮胎不管什么温度都能用,而夏天用的轮胎只能在 ...

  5. bzoj2657: [Zjoi2012]旅游(journey)

    求树的直径 真是太神辣 #include<cstdio> #include<cstring> #include<cstdlib> #include<algor ...

  6. MySQL基础 (DML)

    DML语句             DML操作是指对数据库中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查询(select) 1.插入记录 插入一条 ...

  7. JavaCodeTra 猴子选猴王 约瑟夫循环

    之前用的是循环链表,java刚学,不知道怎么用链表.用个小算法吧 代码: import java.util.Scanner; /** * */ /** * @author john * @约瑟夫循环/ ...

  8. [CSS] @keyframes

    @keyframes swing{ 0% { transform: rotate(0deg)} 100% {transform: rotate(-30deg)} } #sweetlandia{ ani ...

  9. 分享一个牛逼的PHP无限极分类生成树方法,巧用引用(转)

    你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...

  10. media query

    accepted Another useful media feature is device-aspect-ratio. Note that the iPhone 5 does not have a ...