博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
架构之路--实战项目记录(二) 忘记数据库 开始抽象
阅读量:6842 次
发布时间:2019-06-26

本文共 3259 字,大约阅读时间需要 10 分钟。

对我而言,认识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文件吧。

转载地址:http://qjzul.baihongyu.com/

你可能感兴趣的文章
递归小程序
查看>>
管理信息系统测试方法总结(三)
查看>>
证书文件编码格式介绍
查看>>
解决访问网站目录必须增加斜杠的问题
查看>>
第十章 zabbix自动发现功能详解
查看>>
zabbix-client-install
查看>>
限制上传文件的大小
查看>>
网摘精灵教程:网摘精灵延时功能详解
查看>>
英特尔半路杀出要收购博通
查看>>
php5.3.x连接mssql测试文件(ODBC连接方式)
查看>>
OAF_文件系列9_实现OAF解析Excel并读取至数据库JXL
查看>>
Linux4.8下安装yum
查看>>
全能自定义环境,一键快速安装PHP7.2版本,32/64位任选
查看>>
自动化安装linux
查看>>
internet protocal ---IP
查看>>
rrdtool生成图像
查看>>
mysql批量写入数据时,注意事项
查看>>
改变DIV标签内部元素标签的class属性值
查看>>
Data too long for column 'pay_channel' at row 1
查看>>
hbase+opentsdb 单机版搭建
查看>>