浅水滩生活

专注于.NET设计架构和技术、项目管理等IT相关内容

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  21 随笔 :: 2 文章 :: 160 评论 :: 20 引用

.NET的WEB企业应用架构所要解决的若干问题(原创)

微软风风火火地发起了.NET革命,至今已经有4年的时间了,就从其本质的CLR和C#语法上来说,确实比J2EE要进步不少,连Martin Flower在举例说明OO方法时,都不自觉地使用C#来表达。然而若从企业应用的角度上来讲,微软却落后J2EE太多,这主要是从企业应用架构上来说。J2EE由于老主宗SUN公司相对弱势,导致不能很好地控制局面,因此J2EE阵营在发展初期经历了镇痛,但终于依靠开源来达到了空前的盛况,J2EE阵营注重标准、开放、良好架构的原则,并且现在也开始从微软最擅长的易用性向.NET发起攻击,J2EE对于.NET的优势恐怕要持续地保持下去了。反观.NET阵营,商业气息浓烈,由于微软的强势,导致任何的民间组织都倍受压力,微软的发展或者说插入点是从易用性出发,从一些hello world或者petstore的小项目来说,确实有不少优势,仿佛任何的项目都可以在弹指间完成,然后对于大项目事实上是这样的吗?微软的这些易用性通常靠鼠标点击来生成hard-code的代码,从重用性、维护、扩展角度上都要要付出巨大的代价。微软阵营习惯了去使用微软提供的API来完成项目,.NET阵营的特点是封闭、寡头执政、易用。从微软现在的情况看充其量只能在CLR和C#(JRE,和JAVA语法)或者说基础架构上对J2EE有较大优势,但是说到上层的OR-Mapping、表现层框架、AOP架构等,微软几乎无招架之力,而这些就是构建商业应用所最需要的架构,在很多.NET项目中很多的这些商业架构都是靠项目组自己来完成,其痛苦不堪而言。.NET和J2EE之争,仿佛就是6万人组成的严密组织纪律的高素质专业军团和几百万人组成的民间机构体制的竞争,是从"易用性->架构"和"架构->易用性"的2条路线方针的竞争,孰胜孰败,只有靠历史来评判了。

突然发现我扯远了,呵呵!也无所谓了,突来兴致多说点废话了,全当在.NET这个阵营里面生活太久的一些牢骚了。下面我言归正传,来谈谈.NET商业应用架构。首先,我想表达一下,为什么要有提出这个商业架构的问题,我想解决的是什么问题,总得来说商业架构所要解决的是:提高软件质量、加快开发效率、降低维护成本。下面就从商业应用的各个方面来说明:

  1. OR-MAPPING:我认为这是首要解决的问题,是整个商业应用中最需要提高的部分。有了OR-MAPPING,可以将以数据为中心的开发方式转移到以Model为中心的开发方式。不解决这个问题,永远也实现不了在《企业应用架构模式》一书中所说的三种基本模型种的最高层次Domain Model模式。不解决这个问题,3层企业应用中关键层次商业逻辑层的OO就不得执行。
    问题:要求实现商业逻辑和持久化的解耦,项目要求可以跨数据库。
    可能的解决方案:NHIBERNATE(现出于beta版本)、IBatis(1.0版本)
  2. 复杂查询:OR-Mapping不能解决复杂查询的问题,用NHIBERNATE中的HQL也不能很好解决这个问题(若查询牵扯到子对象,必须发送额外的查询语句,以及OR-Mapping中的entity不能完全容纳查询所需的字段)。
    问题:各种商业所需的复杂查询实现需要动态构建很多查询语句,不能很好的统一,也不能很好的维护。
    可能的解决方案:IBatis(1.0版本)
  3. 数据字典:或者说meta-data,即描述数据结构的结构
    问题:很多商业项目要求可自定义字段,自定义报表,自定义查询列表等功能。另外,商业项目中很多查询条件、列表的代码过多重复。
    可能的解决方案:暂无,不过可以参考MSCRM中的meta-DATA的实现。
  4. MVC:
    问题:不用说了。
    可能的解决方案:MAVERICK.NET、UIPB
  5. 事务:
    问题:
        1、数据库的事务不能实现business transaction的功能,要实现required、nonsupported、supported、等形式的事务功能。
        2、开启事务、提交事务,回滚事务的代码过于重复,靠人为约束来实现难免会引入bug。
    可能的解决方案:Enterprise Services  (COM+)(但是将引入难以部署的问题)
  6. 统一页面中的数据验证、读取、和加载
    问题:很多页面的数据验证、读取、加载都类似,但重复地写过于繁琐。要求如日期、金额等格式在整个项目中统一,开发人员在每个页面中做同样的繁琐操作不利用维护。
    可能的解决方案:无
  7. 日志:
    问题:在每个商业应用中,都要写很多类似的日志代码,过于繁琐。
    可能的解决方案:Spring.NET、Aspect#、EDRA
  8. 权限验证:
    问题:在每个商业应用中,都要写很多类似的权限验证代码,过于繁琐。
    可能的解决方案:Spring.NET、Aspect#、EDRA
  9. 解决并发冲突:
    问题:在WEB开发中的并发问题尤其严重,每个页面都可能并多个用户同时打开,架构要处理这种并发问题。
    可能的解决方案:《企业应用架构模式》中的第6章描述。
posted on 2005-01-30 22:16 浅水滩 阅读(6759) 评论(48)  编辑 收藏 网摘

评论

#1楼 2005-01-30 22:46 dudu      
好文章!
麻烦作者调整一下字体。

  回复  引用  查看    

#2楼 2005-01-31 00:18 CsOver      
C#必竟处于起步阶段,不能要求过多。我想以后微软会在这些方面做好的!
  回复  引用  查看    

#3楼 2005-01-31 00:28 idior
不错!
我正在学习《企业应用架构模式>>,欢迎指点一二.

  回复  引用    

我用Ibatis有一段时间了,现在想用用Hibernate觉得Hibernate在复杂查询方面实在不灵活,而且Hibernate的HQL要写在代码中,不易维护!试了几次都放弃了Hibernate
  回复  引用    

#5楼 2005-01-31 08:52 cnlamar
我觉得6的个问题不是DOTNET的问题,是程序员自身素质的问题吧?

9的个问题,我觉得似乎没什么问题?或许我做的应用比较小,不太了解,可否详细说说?

  回复  引用    

学习了,好文章.
  回复  引用  查看    

#7楼[楼主] 2005-01-31 09:36 浅水滩      
问题6:每个页面都写这同样的载入到Entity的代码(报告格式的校验),然后又写从Entity返回到页面的代码(包括格式的转换),这样是不是有点繁琐了?如果在页面上的每个控键的命名规范和entity有关系的话,就可以自动生成代码来解决了。

问题9:有一个客户资料修改页面,A用户打开了,B用户打开了,然后A用户save了,B用户save了,如果不做任何处理,B用户将覆盖A做的修改,如果A用户输入的是重要资料,该资料就go with the wind了,并且没有任何的提示。这个问题就是解决这个例子的。

  回复  引用  查看    

#8楼 2005-01-31 09:39 听棠.NET      
楼主对商业架构确实有一定的研究,对于你说的那些问题,我想一个是持久层的问题,优秀的系统架构是以优秀的持久层为基础的,我的SPL(SamrtPersistenceLayer)其实可以解决1)O/R Mapping;2)复杂查询;5)事实处理
然后其他的一些访问,我想也应该是业务层应该处理的方案,比如权限验证,我的方案是采用BasePage,把页面的验证放在BasePage里处理就可以了;其实楼主说的这些,不可能完全由商业架构来解决,我想每个人都可以有自己的解决方案,就象自定义属性之类的。

  回复  引用  查看    

#9楼 2005-01-31 10:20 age0
你所说的问题,就算是java开发也会遇到,虽然java方面确实有很多开源的框架,但是没有一个方案可以很好的解决这些所有的问题,基本上都是局部有亮点其余的还是要自己解决,有些比较全面的也只能是以大而无当来形容,而且这些框架的稳定性和延续性也没有保障,说不定哪天开发组就解散了,所以无论用哪种框架或技术,要解决好问题始终都是要靠自己。
  回复  引用    

#10楼 2005-01-31 10:42 James      
评论的字体太小了!!!
  回复  引用  查看    

#11楼 2005-01-31 11:56 山药蛋V3.5好文,
评论看的眼花
  回复  引用    

#12楼 2005-01-31 12:11 小李菜刀      
我做的框架只剩复杂查询没有实现啦,呵呵。
已经成功的应用在项目中。

  回复  引用  查看    

#13楼 2005-01-31 12:44       
俺想说的是,易用性远非楼主那只言片语可以描绘完全的,楼主对易用性的理解,不敢苟同,不过楼主的文章还是不错地,^^
  回复  引用  查看    

#14楼 2005-01-31 13:07 Yok      
关于问题6:统一页面中的数据验证、读取、和加载
我实现了这样的功能, 不过还不够成熟. 有兴趣在msn交流一下吗?
wong_yok@hotmail.com


  回复  引用  查看    

#15楼 2005-01-31 15:33 James      
页面的验证放在BasePage里处理并不是好的做法。
  回复  引用  查看    

#16楼 2005-01-31 16:09 Alvin      
楼主太注重技术层面了,架构的优劣当然对开发有一些优势。但单纯的架构好就会催生一个成功的产品吗?
本人才疏学浅,但偶尔听之,好像SAP,oracle等不是靠架构唬人的,靠的是扎扎实实的管理思想融入到产品中才赢得客户的。
所以鄙人愚见,能满足客户需求,客户界面简单易用的产品才是好东西。客户可不管你什么架构不架构,那是程序员的事情,你的技术再好,不合我用,也是垃圾!

  回复  引用  查看    

#17楼 2005-01-31 16:21 湘南和也      
呵呵,楼主很多见解跟我很类似。我就自己总结了一个适合自己的.net开发架构。对于权限验证我的处理是,首先自己写一个类继承basepage类,然后在这个类基础上增加进行验证的代码。然后项目中需要进行验证的页面都继承这个类。
这样就不用重复写验证的代码了。实践证明还很不错

  回复  引用  查看    

#18楼 2005-01-31 16:53 纯爷们      
to Alvin :
对于您所发表的评论,我想提一点自己的看法,SAP,ORACLE的产品是很好,当然我更想说的是其无论是业务架构还是技术架构都是比较成熟的,试想如果一个产品符合用户需求了(我这里指的某一个用户),但是由于用户的需求不同,且行业特点鲜明,尤其是做企业应用软件的,如果我的SAP R/3架构很糟烂,且不说可维护性,就安全性,并发性,同步性,日志,权限做的不好的,有客户愿意用吗?而且如果架构不好必然导致维护费用的升高,那一个R/3要实施上万个不同客户那岂不是光客制化就忙的晕头转,怎么赢利?

我个人不是很赞成技术高与一切,但我相信技术和管理思想的充分结合才能造就出优秀的企业信息化产品。况且产品技术架构本身并不与产品的业务功能架构矛盾:)

非常支持楼主的文章,可后可以发一下相关实践方面的东东!

  回复  引用  查看    

#19楼 2005-01-31 16:58 Yok      
to Alvin
楼主提到的各个方面都是应该解决的问题, 而且是常见的问题, 考虑这些问题不至于是"太注重技术". 良好的架构能大大减少工作量
至于客户需求方面的问题, 严格来说不是程序员的事情吧?

  回复  引用  查看    

#20楼 2005-01-31 18:54 Alvin      
to 纯爷们,Yok
感谢两位的见解,我是仅仅指楼主文章的第一段,呵呵!
至于下面的9点,也要看项目来定,小的项目我不会这样兴师动众,所以我用用自己的设计也就完了,顶多用用application block.
大的项目偶没有能力做,窃以为要实现这些功能不是搬几个开源的软件套套就完事了。 而是要看产品的侧重来具体设计。
我说太注重技术,是因为楼主批 .net 抬j2ee。孰优孰劣我不知道,但我知道SAP R/3 用的好像是自己的开发语言。

  回复  引用  查看    

#21楼 2005-01-31 20:44 不至于
对于sap:
其实不像想象那样不注重架构!
恰恰相反,sap很注重架构.sap的结构十分的灵活.erp能做到这样实属不易!
它基本上实现了商业平台,其在erp领域的地位,几乎就如同windows 在操作系统的地位.

  回复  引用    

#22楼[楼主] 2005-01-31 22:47 浅水滩      
坦白得说,上面我列出的这些问题,有些我解决了(1、9),有些我还没有解决但有把握了(3、4、7、8),有些我有很多思路但把握不大(2、5、6)。这些要解决的问题整天都在我脑子里面转,我现在的项目也非常需要妥善地解决这些问题,一旦有结果,我会整理成KB在这里发布。

另外,我的确热爱编程,热爱架构设计,但是我从来都没有轻视过客户的需求,反过来说也许是为了更好地达到客户的需求,我才会对架构提出这些要求。想想哪一天,客户要求将所有的日期形式从YYYY-MM-DD改成YYYY/MM/DD,如果我的代码需要地震,这是对客户负责的态度吗?架构是商业应用中的重要部分,RUP的3个要点是:用例驱动、体系架构为中心、迭代开发。也就是说,需求、架构、方法,一个都不能少。

  回复  引用  查看    

o/r map 我用的gentle.net,但复合查询现在还没有解决,比较感冒上面提到的:IBatis,
权限问题现在也是比较老火的,看了上面兄弟的留言,但还是不知道具体的实现方法。学习中……

  回复  引用    

对于 AOP框架, j2EE类似的分布式平台, MS已经提供, 可以在gotdotnet.com 上找找 Microsoft EDRA (微软企业开发应用架构).
对于O/R Mapping 可以选择NHibernate, Gentle.net, 以及VS2005中ObjectSpace..., 还可以期待CW语言中提供的直接Sql/XML编程.
所谓企业级开发.net并不差于j2ee, 只是大家的思维定势了.

  回复  引用  查看    

关于权限问题是比较讨厌的, 从逻辑控制到UI显示, 其难点在于UI显示的控制;
这些权限问题大多见于中国的一些软件,主要是与系统配合的职责不清.

  回复  引用  查看    

#26楼 2005-02-01 11:52 SW515[未注册用户]
  楼主有些观点我不是很认同。

  OR-Mapping 在Java阵营中是否那么重要我不是很清楚,但是,我认为在 .NET 中 OR-Mapping 却可有可无,至少我不喜欢用这项技术来实现数据存储和映射,为什么说在 .NET 中对此项技术可有可无呢,因为 ADO.net 中的 DataSet 已经足够强大好用,在《企业应用架构模式》一书中有阐述(P22)“是否使用‘表模块’很大程度上取决于环境对通用记录集结构的支持。如果开发环境拥有大量基于记录集的工具(如 .NET 或 Visual Studio),则表模块就很有吸引力。事实上,我找不出在 .NET 环境下使用事务脚本的理由。当然,如果没有特定的基于记录集的工具,我就不会纠缠于表模块。”

  在 ADO.net 中,你其实可以使用强类型的 DataSet 来完成 OR-Mapping 的工作,且这一编程非常简单,VS中并提供了工具来帮你生成你的业务类。同样,因为使用了 OR-Mapping 所以就需要查询这些对象数据,那么这就产生了一个需要完成类似 SQL 工作性质的“对象查询语言”的东西,很遗憾,目前这项技术还不成熟,也没有形成标准,在 BEA 的 WebLogic 中有关这方面的功能就很弱,只能做简单映射的查询操作。俺也没事写了一点这方面的文字,还请各位赐教。[http://blog.csdn.net/sw515/archive/2004/11/05/169050.aspx]




  至于其他的一些应用服务或相关扩展组件,则见仁见智了。基于.NET 的相关企业化的服务、组件的发展相当迅猛,相对 J2EE 这个前辈而言不可不谓后生可畏啊!呵~

  回复  引用    

#27楼 2005-02-01 12:13 听棠.NET      
呵呵,这里还比较热闹:)
其实吧,楼主说的东西,都是可以实现的,因为这些是系统框架与系统设计的问题,因此没有所谓的J2EE与.NET之分。
系统是需要思想与技术并重的,业务思想是精神,技术是个载体,只有好的精神赋在好的载体上,才会体现出优势,就象SAP。所以,我们要掌握优秀的业务思想,然后从技术上分析,找出好的解决方案,用技术来实现,这才是我们的当务之急啊。

  回复  引用  查看    

#28楼 2005-02-01 13:08 idior      
SW515 你有没有仔细看书?还是看的中文版(我没看过中文的)?
orm是为Domain model服务的,事务脚本是最简单的方法,根本不需要orm。
martin明显倾向于Domain model。
只是.net提供了dataset的支持,所以表驱动才显的有些竞争力。
不过Domain model肯定更好。不然哪来那么多orm,ms都在搞。

  回复  引用  查看    

#29楼 2005-02-03 10:56 SW515[未注册用户]
To 听棠.NET:
  呵呵,通常我们讨论的“思想”都是可以在技术上实现的,但问题是我们不太可能完全去重新实现他们,重新发明轮子是不明智的,至少成本上是不划算的吧?!SAP 都是用自家的东西,但是我们却没有这样的影响力更没有这个财力和项目期限,所有通常我们总是在J2EE或者.NET或者其他开发平台上来实现自己业务系统,所以比较这些平台在某些技术方面的差异并根据自己的应用的需求来选择适合自己的技术平台就变成最可行的办法了,不然就得自己去实现某些相对底层的服务,那么通常这对一个商业项目而言是难以承受的。


To idior:
  我看的是中文的书,也可能没有你看的那么仔细吧,所以有些地方说得不太清楚。

  Domain Model 我的理解是 完成某个(些)特定业务领域任务的类就是一个领域模型,所以无所谓太过区分表驱动和领域模型,事实上它们就是混为一体的。表模块也只是将特定的业务对象使用类似 DataSet 这样的东西来传递数据罢了,对数据的操作方法还是在这个业务对象内,只是这个业务对象使用 DataSet 来作为数据传输的媒介而不是该对象本身。

  通常在 J2EE 应用的领域模型内使用的是属性(Properties)、成员域(Fields)或者集合(Collection)/列表(List)/数组(Array)等来表示和组织业务数据,而在 .NET 中更多的是使用的 DataSet(XML) 来组织和传递业务数据,就此差别而已。正如你在你 blog 中所说 O/R Mapping 的处理有些麻烦,那么既然 .NET 提供了好用又灵活的 DataSet 所以我想 Martin 才会说出“如果开发环境拥有大量基于记录集的工具(如 .NET 或 Visual Studio),则表模块就很有吸引力。”的话来吧?!当然同时他也说“如果没有特定的基于记录集的工具,我就不会纠缠于表模块”,这便是不同技术平台决定了其实现者的不同技术选择方案,很幸运,.NET 便给了我们这样一个快乐的选择,如若不然,我们就得自己实现这样的底层东西,这可能对某些人而言是件高兴的事情,也或许是个痛苦的抉择。

  回复  引用    

#30楼[楼主] 2005-02-04 19:34 浅水滩      
关于.NET中的架构模式,其实在Martin的书中已经申明了他的观点,.NET比较适合用Table Model的架构模式,因为.NET提供了强大的Dataset,但是如果用Table Model模式,Model层的类的所有业务方法必须是静态的,也就是说不能很好的OO。而若在.NET中使用Domain Model模式,那就必须抛弃.NET中的Dataset,但Domain Model一定是优于Table Model模式的。这是一个艰难的选择,但是我们项目组几乎已经完全肯定准备抛弃Dataset,而用Domain Model模式了。

我以前也用强类型的Dataset来做.NET项目,并且自己开发了一套Table Gateway(或者说是一个O/R Mapping,但不包含关系)以及一套复杂查询的持久层。但是Dataset操作起来还是相当麻烦。而现在有了NHibernate了,我想Dataset就可以更有理由抛弃了。呵呵!

  回复  引用  查看    

#31楼 2005-02-05 18:13 kevinzx
好热闹,支持一下!
加油阿!期待更好的文章。

  回复  引用    

#32楼 2005-04-24 11:53 听棠.NET      
@SW515 :
看来你说“思想”跟我说的“思想”不是一回事啊。
我说的“思想”是系统的业务思想,跟业务没有多大的关系,至于你说实现不了,那只是说用那种方式实现不了,可以找替代的方式,为了实现一种思想,可以在不同的技术平台上找到多种实现方式,可能会因为技术平台的原因而麻烦一点,但这不可能否定“业务思想”的先进性啊。。
明白吗?如果你的思想只是停留在所谓的“技术可实现”上,那这种不叫做“业务思想”,业务思想是个逻辑,是个大方向,如果你连大方向都掌握不了,如果你觉得技术上实现比较麻烦而放弃了大方向。真不知这东西又是给谁用了?你自己?程序员自己?

  回复  引用  查看    

#33楼 2005-05-27 13:37 redmoon      
用了Table Model就一定排斥Domain Model吗?
有了NHibernate就一定不能用DataSet了吗?

  回复  引用  查看    

#34楼 2005-05-28 09:49 firefox
请教MSCRM是如何通过Meta-data实现自定义字段的
  回复  引用    

#35楼 2005-06-01 21:10 wjzhou
DataSet的一大硬伤是没有多态/继承/策略等,从而无法实现一个OO的业务层,要实现复杂的业务层,O/R是必要的,如果只是一个CRUD之类的业务,用用DataSet也行。
  回复  引用    

#36楼 2005-07-25 10:15 蛙蛙池塘      
大家们都喜欢讨论架构,模式的问题,都喜欢用一套自己的架构,可见谁开发的架构也不是万能的,最后还是相信自己开发的,楼主说的确实覆盖了好多架构中通用的问题,但是能覆盖完用户所有的需求吗,个人感觉这不能说是.NET的问题吧。
  回复  引用  查看    

#37楼 2005-08-12 18:47 匿名[未注册用户]
我对.net架构不是很熟悉,在.net领域是否有一些关于模型驱动方面的最佳实践,也就是最佳做法?关于层次结构,关于分离的原则(模型、控制、视图的分离),关于方面的分离(如权限、事务的分离)。而在JAVA领域,这些思想都有成熟的、广泛使用的解决方案。

我比较推崇模型驱动的做法,推崇面向对象的设计方法,看到上面大量讨论关于Dataset的使用,这明显不是一种面向对象的处理方案。

.net是否也是推荐使用MVC原则?

  回复  引用    

#38楼 2005-08-13 08:23 蛙蛙池塘      
现在能实现MDA吗
  回复  引用  查看    

不错,收藏.
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 99596




相关文章:

相关链接: