阅读: 1320 评论: 18 作者: 小洋(燕洋天工作室) 发表于 2010-05-23 09:03 原文链接

.NET 分布式架构开发实战之一 故事起源

  前言:本系列文章主要讲述一个实实在在的项目开发的过程,主要包含:提出问题,解决问题,架构设计和各个逻辑层的实现以及新问题的出现和代码的重构。本系列文章以故事的形式展开,而且文章列举的很多项目的名称,大家也不用太关心,很多都是虚拟的。

本篇主要讲述项目的一些背景。

新人Richard被分配到了一个企业自动化信息管理项目组--Automation Information Management Project(后面简称AIM),当Richard进入项目组的时候,这个项目已经开始了,项目的架构也已经在两周之前构建好了--SOA架构,而且使用的主要技术也敲定了:WCF, Linq.

:因为项目是首次采用"新技术"(因为以前没有使用WCF,Linq,所以被称为新技术),项目就这样开始进行了。

半年之后问题就开始出现了(其实问题就一开始就出现了,只是大家还认为问题不大):因为当初在设计的时候,项目的架构是由项目组的其他两个人设计的,整个项目开发基本上就没有采用面向对象的思想来开发,而且虽然在架构设计上分了:数据层,业务层,服务层,和UI层,但是各层之前是紧紧的耦合,可以说是“牵一发而动全身”:如数据访问层稍微一改,业务层就跟着动,然后改变一层层的开始波及。

大家都开始觉得这样很累,但是项目已经做到这个阶段了,不可能重来。每次新需求一来,项目的的改动可以说是天翻地覆。而且当初设计架构的那位仁兄也就项目一开始的一个月后就走了。

下面的图就展示项目中的架构设计:

   

   咋一看起来还是不错的,一般的架构都是这样设计的。下面就开始讲述它们之间的一些调用关系,看看有什么问题:

数据访问层:

    public class EmployeeDAL
    {
        public List<Employee> GetAllEmplyees()
        {
            //...
        }           
    }

其中Employee就是Linq生成的一个实体对象。

业务层:

代码

    public class EmployeeBL
    {
        public List<Employee> GetAllEmplyees()
        {
            EmployeeDAL employeeDAL = new EmployeeDAL();
            return employeeDAL.GetAllEmplyees();
        }
    }

服务层:

代码

    public interface IEmployeeServices
    {
        List<Employee> GetAllEmplyees();
    }

public class EmployeeServices : IEmployeeServices
    {
        public List<Employee> GetAllEmplyees()
        {
            EmployeeBL employeeBL = new EmployeeBL();
            return employeeBL.GetAllEmplyees();
        }
    }

然后就是在客户端生成代理,然后在UI中就调用了提供的方法。

现在一个最明显的问题就是:把数据层的数据实体Employee一层层的传递,最后到了客户端的UI代码中,而业务层中的EmployeeBL基本上没有起到什么作用,只是起到一个过渡的作用,只是在Insert ,Update,和Delete的时候,对一些字段进行了相应的Check和Validation,如Email格式是否正确等等。其他的一些流程的Check也是代码的堆积,业务类很"弱"。

总的看起来就是"牵一发而动全身"的效果。

而且在开发过程,分层的好处基本没有体现出来。

在业务类的设计的时候,所有的业务类都显得比较的"弱",之所以这么说,主要是基于这样的一个思想:

都知道,在面向“对象”设计的过程中,每个类就好比一个人,实例化一个类就好比生成了一个人,这个人可以在一出生就具备很多的能力(天生秉异),如异常处理,日志跟踪,缓存,通用的验证机制等等;也可以一出生什么都不会(或者只会做最基本的几件事情)。之前的业务类实例化之后就生成一个非常普通的人。每个类都得重写很多的基础代码,说到通用那就只是copy代码。如果想要使得新生成的类很强大,具备很多功能,在设计的时候可以让这些类继承一个功能比较强大的基类。当然继承只是实现方式的一种。

现在Richard已经被分到了另外的一个项目组(也是本系列文章要讲述的一个项目,就称为项目进度管理系统—Project Process Management(PPM)),而且担任了架构的设计和开发(之前的架构设计Richard没有发言权)。有了前车之鉴,在新项目开发之前的几个月,Ricahrd首先就开始了通用架构的设计,目的有两个:

1.解决之前项目的问题:不灵活,不通用,每次都做重复性的事情等。

2.结合自己的考虑,开发一个Framework,使得开发更加的快速,灵活,强大。

其实在项目真正开始了之后,不可能给你几个月的时间去设计架构的。其实在AIM出现问题之后,Richard就已经在构思如果开发一个通用的Framework了(”通用”--不表示就是到处可用,因为公司的一直是开发某一领域软件的,比如现在的公司就擅长开发企业管理的一些软件,所以开发出一个基于领域模型的架构和框架还是有可能的)。Richard也想挽救AIM,由于诸多原因,想法终究只是成了想法。

在从AIM项目出来之后,Richard又开始了另外的一个项目的开发,名称我们暂时就虚拟的称为EMS(Employee Management System),EMS项目不是很大,公司解决让Richard一个人开发这个项目。这个项目给了Richard很多的时间来考虑架构设计和Framework设计的时间,因为EMS项目不是很复杂,而且技术和进度都在掌控之中,在正常上班时间就可以到时候定期交付。所以每天下班之后,Richard开始加班去构思Framework的设计,开发的时间越长,技术就应该沉淀的越多,如以通用类库,组件的方式或者解决问题方案的文档等出现。只有这样,下次的开发才更加的快速。

3个月下来,EMS项目完成了。而且Richard设计的Framework也有了雏形。准确的说,还只能称为 基础架构基本完成。EMS没有采用这个Framework来开发,因为Framework的设计和实现于EMS是同步进行的。

Richard心里是这样认为的:设计通用的架构,然后在项目中不断的锤炼,更新,产生出通用的代码,然后演化为Framework。只有设计出了自己的Framework,以后的开发才有可能进入"光速开发"。

在这个项目开始之初,Richard就和其他几个组员讨论了如何实现,同时也推出了自己开发的成果。商量之后,决定采用Richard的设计。

Richard在设计架构的时候,也参考了现在流行的一个Framework,如Spring.NET ,CSLA.NET, Nhibernate,主要吸收它们的一些思想,同时也分析了这些Framework对自己项目的利弊。而且认为:没有绝对万能的技术,一个架构的实现需要在很多的因素之间权衡,技术不是用来show的,而是用来解决问题,这就是技术的价值。

本系列文章就展示整个构思,设计,实现的过程。本系列文章所要开发的项目的价值可能不大,本系列文章的价值在于架构的思考和设计过程,一步步的演化过程。   

  谢谢大家:)

  下篇文章:.NET 分布式架构开发实战之二 草稿设计

  欢迎大家参加企业级项目开发团队

  版本规个人和博客园所有,转载请标明出去和作者。

评论: 18 查看评论 发表评论

有道难题2010网易编程挑战赛


最新新闻:
· Google谈搜索:微软财大气粗 需时刻提防(2010-05-24 11:51)
· 盛大文学进军网页游戏 业内人担心难逃同质化(2010-05-24 11:49)
· 丁磊开始买红酒:联手温州资本开酒庄(2010-05-24 11:43)
· 微软Windows、McAfee、Firefox漏洞回顾(2010-05-24 11:33)
· HTML简史:HTML5将于2012年被接纳为候选标准(2010-05-24 11:29)

编辑推荐:为什么硅谷最牛的人都是在创业公司?

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

转载于:https://www.cnblogs.com/tanshuicai/archive/2010/05/23/1742677.html

[原创].NET 分布式架构开发实战之一 故事起源相关推荐

  1. [原创].NET 分布式架构开发实战五 Framework改进篇

    原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...

  2. .NET 分布式架构开发实战之二 草稿设计

    前言: 本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下: 1) 第一个数据层草图的提出 2) 对数据访问层的思考 3) 第二个数据层草图的提出 1.数据层 ...

  3. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(前篇)...

    .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(前篇) 前言:这个系列有段时间没有动了.主要是针对大家的反馈在修改代码.在修改的过程中,也有了一些新的体会,这里和大家分享一下,同时也 ...

  4. [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

    .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 前言:之前的讨论一直关注在怎么从DAL中获取数据,以及数据的Mapping问题.实际上,一个业务框架最主要的作用就是简化业务 ...

  5. [原创].NET 业务框架开发实战之六 DAL的重构

    .NET 业务框架开发实战之六 DAL的重构 前言:其实这个系列还是之前的".NET 分布式架构开发实战 ",之所以改了名字,主要是因为文章的标题带来了不少的歧义:系列文章中本打算 ...

  6. [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)...

    .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [原创].NET 分布式架构开发实战之一 故事起源 [原创].NET 分布式架构开发实战之 ...

  7. 阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

    什么是微服务架构 微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完整服 ...

  8. 微服务分布式构架开发实战PDF,阿里架构师推荐,快快收藏吧

    什么是微服务架构 微服务是一种软件架构风格,目标是将一个复杂的应用拆分成多个服务模块,每个模块专注单一业务功能对外提供服务,并可以独立编译及部署,同时各模块间互相通信彼此协作,组合为整体对外提供完整服 ...

  9. 微服务架构开发实战:如何实现微服务的自动扩展?

    微服务架构开发实战:如何实现微服务的自动扩展? 程序员高级码农II 2020-09-25 07:25:00 如何实现微服务的自动扩展 前面讲了一些关于自动扩展的理论知识,但如何实现自动扩展,并不是三言 ...

最新文章

  1. 安装meme_通过构建Meme生成器学习React
  2. oracle 9.2.0.2,在RedHat enterprise server 3 安装oracle9i 2.0.0.1 并升级到9.2.0.6
  3. c语言菜单输入字母死循环,C语言循环菜单的设计--让程序一直运行
  4. 建模算法(八)——插值
  5. c# 多线程单例模式_线程安全C#单例模式
  6. PLSQL配置Oracle 64位
  7. vb.net 使用ftp协议上传、下载文件(Visual Studio 2019)
  8. Java + OpenCV 实现图片人脸检测
  9. 传统企业如何开启O2O营销模式?
  10. 人民日报申论范文:如何写“担当”“责任”
  11. 求职过程中展示您的社交技巧
  12. aris系统流程图意思与或非_流程管理
  13. 鼠标右键多余菜单的清理
  14. 使用app管理家庭路由器(TP-Link,水星,腾达等)
  15. 推荐18个非常棒的Web和移动开发框架
  16. webservice报错Message part refundRequest was not recognized. (Does it exist in service WSDL?)
  17. Windows如何连接远程桌面?远程桌面控制软件推荐
  18. 数据库开发与设计规范
  19. SQL注入靶场 RedTiger通关教程(level1~level10)
  20. pdf如何压缩?pdf太大怎么压缩大小?如何在线压缩pdf文件大小?

热门文章

  1. Markdown与 $\LaTeX$ 公式的使用入门指南
  2. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
  3. python三十三节_第三十三节,sys解释器相关模块
  4. spring基于注解的IOC以及IoC的案例——概念
  5. 实验12:引用外部属性文件★(spring管理连接池);
  6. windows 技术篇 - cmd命令查看当前目录下的所有文件和文件夹以及所有子目录下的文件,dir命令的使用方法
  7. CTFshow 命令执行 web41
  8. C++中的函数指针和函数对象总结
  9. Pytorch自定义数据集
  10. QT,C++多项式计算器—version3(厌倦CMD黑框框的走起!)