对我而言,认识BLL层的作用,或者领域模型驱动的含义,最大的干扰来自数据库。

我们很清楚的知道UI层的含义,也知道数据层是做什么的。但对于一个简单的(甚至是相当复杂的)系统而言,实在不知道除了对数据库进行增删改查以外,还能做些什么?发布一篇博客,不就是在数据库里插入一条记录么?点击一下推荐,不就是在数据库里做一个update么?

为了避免数据库的干扰,这里,我们设定:不使用关系数据库做存储!请大家牢记,为了更清晰,更深刻的认识到这一点,我们再次明确,我们将使用最流行的NoSQL技术。牛叉吧!兴奋吧?

打满了鸡血吧!

好的,设计的任务交给你了,小李同学。

接下来,你怎么办?哎呀,我对NoSQL还不熟呀(不熟?其实除了名字知道以外,其他什么都根本就不知道)。马上开始研究一下NoSQL,看看里面有没有什么库呀,表呀之类的,好像那里面用的是集合?

如果你这样走下去的话,就偏离了DDD的宗旨了(但也不能说你“错”了)。

我是这样做的。

问:这个系统要做什么?有哪些功能?

答:发布博客,博客可以评论。可以提问题,回答问题。当然,做这些事,都得注册登录……

好,根据以上信息,我们可以抽象出这几个对象。

这是一个良好的开端。再细致点,博客和问题,都必须有标题;而博客的评论和问题的答案,不需要标题;但不管是博客还是问题,评论还是回答,都会有一个作者,都要发布时都要记录下

发布的时间,甚至发布者的IP(基于中国人都知道的原因)。博客和问题,还要记录下浏览量……

到这里,你是不是嗅到了一种什么味道?“不管……还是……都……”,共同的东西!那么想到面向对象的三大特征,“继承”就呼之欲出了。所以我们通过抽象,得到了以下的对象。

View Code

/// <summary>
    /// Article is abstract, means it's not a really entity
    /// </summary>
    public abstract class Article : Entity<int>
    {
        #region Properties

#region Content
        public virtual string Body { get; set; }
        #endregion

#region Log
        /// <summary>
        /// Need not set manually in most scenarios
        /// </summary>
        public virtual string PublishIP { get; set; }
        /// <summary>
        /// Need not set manually in most scenarios
        /// </summary>
        public virtual DateTime? LastModifiedTime { get; set; }
        #endregion

#region Associates
        public virtual User Author { get; set; }
        #endregion

#endregion

#region Public Methods

public virtual void Publish()
        {
            #region set some default value

setCreatedTime();
            setLastModifiedTime();
            setPublishIP();

#endregion
        }

#endregion

#region Protect Methods

protected virtual void setLastModifiedTime()
        {
            if (LastModifiedTime == null)
            {
                LastModifiedTime = DateTime.Now;
            }
        }

protected virtual void setPublishIP()
        {
            if (string.IsNullOrEmpty(PublishIP))
            {
                PublishIP = HttpContext.Current.Request.UserHostAddress;
            }
        }

#endregion
    }

/// <summary>
    /// represent article can be regarded as the main part of one page, e.g. Blog and Question
    /// </summary>
    public abstract class MainArticle : Article
    {
        #region Properties

#region Content
        public virtual string Title { get; set; }
        public virtual string Keywords { get; set; }
        #endregion

#region Credit
        public virtual int ViewCount { get; set; }
        #endregion

#region Log
        #endregion

#endregion

#region Methods

public virtual void View()
        {
            ViewCount++;
        }

#endregion

}

public class Blog : MainArticle
    {
        #region Properties

#region Associates
        public virtual CategoryOfBlog Category { get; set; }
        #endregion

#region Content
        public virtual string BlogAbstract { get; set; }
        #endregion

#endregion
    }

public class CommentOfBlog : AttachedArticle
    {
        #region Properties

#region Associates
        public virtual Blog ReferredBlog { get; set; }
        public virtual CommentOfBlog ReferredComment { get; set; }       
        #endregion

#endregion
    }

public abstract class AttachedArticle : Article
    {

}

public class Answer : AttachedArticle
    {
        #region Properties

#region Associates
        public virtual Question ReferredQuestion { get; set; }
        public virtual Answer ReferredAnswer { get; set; }
        #endregion

#endregion  
    }

这样做的好处,很明显的,就是减少了重复代码。“代码越少越好”,我深以为然。当然,随之而来,还有其他好处,容后再表,呵呵。这里只说一句,良好的抽象是实现设计模式的基础。

其实,只要有面向对象的思想,进行这样的抽象是相当容易的(这样的抽象也是不对的,以后再论述)。但我们常常会被关系型数据库所干扰(尤其是有一定开发经验的程序员),而不敢进行这种“大胆的”抽象。因为即使将代码写到这里了,也得面临一个很现实的问题,接下来怎么办?最终我们怎么把这些对象持久化(保存到数据库或其他媒介中去)。这就是我们接下来要进行的工作了。

最后,对那些还想着数据库的同学,再重复强调一点:这个项目,我们用NoSQL!哦,sorry,改主意了,大家反映NoSQL太难了,又说干脆用xml文件吧。

架构之路--实战项目记录(二) 忘记数据库 开始抽象相关推荐

  1. 鸿蒙开发|呼吸训练实战项目(二)

    文章目录 鸿蒙开发|呼吸训练实战项目(二) 实现训练页面与主页面之间相互跳转 运行效果 实现思路 代码详解 验证应用和每个页面的生命周期时间 运行效果 在主界面中显示logo和两个选择器 实现思路 代 ...

  2. Python实战项目(二)写一个枪林弹雨的辅助外挂

    Python实战项目(二)用python写枪战游戏-枪林弹雨的辅助程序 声明:本文章纯属个人学习所作,切勿用于非法渠道.转载请注明原文链接. 最近闲得无聊,在qq微端上找游戏玩,偶然看见一个枪战游戏, ...

  3. 天猫整站SSM项目(二)数据库设计

    天猫整站SSM项目(二)数据库设计 一.数据库设计分析 二.创建数据库 1. 建立数据库 2. 表与表之间的关系 2.1 表![在这里插入图片描述](https://img-blog.csdnimg. ...

  4. Vue项目实战项目记录(电商后台管理系统)

    学习视频:本站Vue实战项目:电商管理系统(Element-UI) 项目的实现效果 前言 时间:2021/10/5--2021/10/20 断断续续的完成了这个项目 gitte完整项目地址 后台项目文 ...

  5. mysql主从架构升级_实战项目——mysql主从架构的实现

    一主一从 1.1 环境准备: centos系统服务器2台. 一台用户做Mysql主服务器, 一台用于做Mysql从服务器, 配置好yum源. 防火墙关闭. 各节点时钟服务同步. 各节点之间可以通过主机 ...

  6. 【迭代式开发】V1软件需求规格说明书——大数据开发实战项目(二)

    文章目录 前言 1.引言 1.1目的 1.2项目背景 1.3缩写说明 1.4术语定义 1.5参考资料 1.6版本信息 2.任务概述 2.1系统定义 2.1.1项目背景 2.1.2项目要达到的目标 2. ...

  7. python数据分析案例简单实战项目(二)--零售商品数据分析

    项目目标 1.根据附件1和附件2分析热销商品并可视化 import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv(r' ...

  8. python数据分析案例简单实战项目(二)--新冠疫情数据分析

    项目背景 2020 年 1 月新型冠状病毒(以下简称新冠)肺炎在极短时间内就在全球范围内大规模流行,据美国约翰斯·霍普金斯大学 11 月 8 日发布的新冠疫情最新统计数据显示,截至美国东部时间 11 ...

  9. IOS客户端Coding项目记录(二)

    9:第三方插件整理 JSON转实体:jsonModel https://github.com/icanzilb/JSONModel/ 美化按键:BButton https://github.com/m ...

最新文章

  1. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
  2. netapp更换硬盘
  3. OpenGL stencil test模板测试的实例
  4. matlab kfda,SVD与KFDA相结合人脸识别-matlab-毕业论文
  5. ffmpeg优化mp4以及hls参数设置
  6. 新当选ACM Fellow李向阳教授:心有理想 向阳而生
  7. ECCV 2020 | 自监督任务辅助的知识蒸馏
  8. SpringCloud工作笔记052---SpringCloud打包部署流程_打包时报错: BeanCreationNotAllowedException: Error creating bean w
  9. 软件安装——在Vmware中安装CentOS7(转载)
  10. 微信开发者工具命令行_微信开发者工具 Linux版
  11. POI导出excel加水印
  12. 关于80286——《x86汇编语言:从实模式到保护模式》读书笔记15
  13. MP1655GG-Z MPS/美国芯源 MOSFET 的开关模式转换器 资源 方案
  14. 外卖联盟高级接口 - 美团联盟接口 美团外卖CPS+CPA推广活动推广API接口
  15. 《MATLAB 神经网络43个案例分析》:第34章 广义神经网络的聚类算法——网络入侵聚类
  16. HighlightPlus物体自发光
  17. 数据标注自动化工具 - Snorkel【机器学习】
  18. 2021计算机考研408计算机学科专业基础综合冲刺复习提纲
  19. ubuntu在目录下文件中搜索关键字
  20. dhcp服务器显示不启用,如何启用dhcp服务器

热门文章

  1. resttemplate 文件上传 上传文件
  2. DELPHI 10.2(TOKYO) FOR LINUX的兼容性说明
  3. Opencv4.5.0+VS2019+win10环境配置
  4. C#基础知识(个人笔记)
  5. pythonbreak可以跳出递归吗_怎样强制退出递归函数
  6. 隧道凿岩机器人传感器_【谷企动态】天创电子管廊综合监控平台及机器人系统在国家电网项目顺利交付应用...
  7. wordpress ajax 调用wpdb_莫名其妙的调用Roboto字体又莫名其妙的恢复的过程
  8. 19.VS属性管理器窗口不见了怎么办?
  9. C++知识点42——下标运算符[]的重载及string类的实现
  10. Python进阶6——序列操作