再谈分层--好吧,我承认这个话题有点俗

 一.层是指什么?为什么要分层?
    对于层的概念,我的理解是包括"抽象层"和"实现层", 即是OO五大原则之依赖倒置原则(DIP), 让你的应用依赖于抽象而不是具体实现. 最常见的做法是加入数据访问的抽象层, 以此来解除对数据库类型的依赖.

  二.要分哪些层?
    需要解藕哪些层, 就分出哪些层.

  三.一般都需要解藕哪些层?
     1.数据访问层, 解除对数据库类型的依赖.
     2.实体层,这主要是因为在ORM的存在, 让Model变的臃肿, 违反了OO五大原则之单一职责原则(SRP):本来一个实体只有表示数据的职责, 现在还多了数据持久化的职责.如果说数据访问层或ORM解除了对数据库类型的依赖, 则数据访问层+实体层就是解除了对数据库类型和数据访问方式的依赖.对开发者来说, 好处就是前期可以使用ORM减少数据访问操作的复杂度, 后期可以根据需求,将部分实现替换成ADO.NET等高效率数据访问方式, 以扩展的形式快速的应对变化.附一个UML图:
 
     3.业务逻辑层.
       很少业务逻辑层能复杂到需要将每个功能都抽象出来, 所以并不需要做到上面两种那样.一般来说, 策略模式+模板方法模式就可以满足需求了.
     4.表示层.
       表示层的模式,常见的有MVC和MVP.MVC适合做展示数据的前台网站,MVP的特点是可以不依赖UI层,换句话说,你可以做一个Web的表示层,再做一个WinForm的表示层.至于WebForm模型, 能玩的花样很多, 关键看用的人的水平了.
 
  有空打算写一个类似<<微型项目实践>>系列的文章, 说明如何开发一个可扩展,易测试,易修改的.NET项目,以及各种常用开发组件在项目中的使用,如企业库,NLog,PostSharp(AOP框架)等.

Tag标签: 分层

posted on 2008-06-15 01:22 xiaosonl 阅读(2156) 评论(23)  编辑 收藏 所属分类: .NET Framework

评论

#1楼  2008-06-15 07:09 金色海洋(jyk)      

>>实体层,这主要是因为在ORM的存在

好像是先有了 实体类和数据库,然后由于持久化比较烦,所以才出现了ORM吧。

迷糊呀。越来越迷糊了。   回复  引用  查看    

#2楼  2008-06-15 09:24 Justin      

可以把分层理解为面向接口编程的一种表现形式   回复  引用  查看    

#3楼  2008-06-15 09:24 钢钢      

@金色海洋(jyk)
我推荐你看我的这篇文章并实践一下,应该会对你起点作用。
Abstract Factory 抽象工厂设计模式 http://www.cnblogs.com/xugang/archive/2008/06/11/1217227.html   回复  引用  查看    

#4楼  2008-06-15 09:41 Jeffrey Hua [未注册用户]

分层是Enterprise Application设计的一个最重要的idea之一,讨论这个话题,有什么俗的?
难道你有比这个不俗的话题?
很多的开发人员在layer方面都做得不够好,理解和运用的不够透彻,或者说没有实际的project的经验,总是追逐一些时髦的词汇,以为那样就是不俗。

  回复  引用    

#5楼  2008-06-15 10:02 啊啊啊 [未注册用户]

这主要是因为在ORM的存在, 让Model变的臃肿?
楼主你看到那个成熟的ORM几这样?   回复  引用    

#6楼  2008-06-15 10:04 gakaki [未注册用户]

都讲要分层 具体怎么分的文章倒是少的可怜   回复  引用    

#7楼  2008-06-15 11:13 brightwang      

现在在用LINQ,已经出现LZ所说的Model的问题了,LINQ做分层好恶心啊。   回复  引用  查看    

#8楼  2008-06-15 11:21 一个农民 [未注册用户]

最近看了一篇文章, 里面讲ebay的架构是不使用分布式缓存的。完全采用数据库切割方式, 震撼。要知道多少牛人强调cache的重要性呀。 可人家竟然不用。由于人家使用了数据库切割,就要涉及到分布式事务, 可以他们也不采用分布式事物,链接如下:
http://www.infoq.com/interviews/dan-pritchett-ebay-architecture
所以万事万物没有定式, 抱着八股文不放,只是庸才而已。
哎没有办法, 都是这个培养庸人的体制下出来的人。   回复  引用    

#9楼 [楼主] 2008-06-15 12:36 xiaosonl      

@钢钢
我都是用IOC,微软的Utilty
@啊啊啊
我用过的ORM几乎都依赖于实体对象.
@一个农民
那篇文章我也看过了,从来没有最好的架构,只有最适合的架构.
@金色海洋(jyk)
没有错   回复  引用  查看    

#10楼  2008-06-15 13:57 簡簡單單..      

Mark   回复  引用  查看    

#11楼  2008-06-15 15:03 Jeffrey Zhao      

--引用--------------------------------------------------
brightwang: 现在在用LINQ,已经出现LZ所说的Model的问题了,LINQ做分层好恶心啊。
--------------------------------------------------------
说说LINQ to SQL分层有什么问题呢?   回复  引用  查看    

#12楼  2008-06-15 15:23 henry      

@xiaosonl
NHibernate的model臃肿?臃肿在那里?
一个纯object,不需要继承base class也不需要实现interface.
即使实现了interface也不代表臃肿!   回复  引用  查看    

#13楼  2008-06-15 15:45 一个农民 [未注册用户]

@jeffry Zhao
正好要请教老赵linq的问题
select new
{
customer.customer id,
customer.customer_name,
customer.customer_address
}
这里产生的一个匿名对象只在method内有效,难道一定要声明一个对应结果集的类吗? 这样会不会类太多了吧, 何况,也不便于修改,你是怎么处理的?
这就是我在linq分层碰到的一个问题   回复  引用    

#14楼  2008-06-15 15:50 王孟军!      

BS系统,我一般用ASP.NET开发,所谓MVC,MVP都没弄过

平常,我都只数据访问层抽象出来
而模型层,只是一些简单的分类,并没有用到ORM
而UI呢,只是一些简单的方法调用

有时间,请楼主多指点
小弟:王孟军
MSN:wmj2212@126.com
blogs:wmj.cnblogs.com
谢谢
  回复  引用  查看    

#15楼  2008-06-15 15:53 brightwang      

@Jeffrey Zhao
主要是在用的过程中发现在各个层中传递的实体有点问题,如果用linq to sql的话生成的匿名类的集合传到上两层中的iquaryable不是强类型的,为了在传递到上两层操作就要自己去扩展定义个view model,可是linq to sql自带的model就废了,而且在进行转换的时候还要用集合初始化器手动赋值,好累啊,当然可能是我自己不会用,还请赐教。   回复  引用  查看    

#16楼 [楼主] 2008-06-15 17:18 xiaosonl      

如果需要返回强类型的对象,那么只能定一个View了.如果只是为了绑定,那么返回一个IEnumable就可以了.View的数据可以用NBear.Mapping来填充,会简单很多.   回复  引用  查看    

#17楼  2008-06-15 17:34 金色海洋(jyk)      

我的数据访问的部分的处理方式
http://www.cnblogs.com/jyk/archive/2008/06/15/1222637.html
  回复  引用  查看    

#18楼  2008-06-15 21:05 炭炭      

LZ 终于说出了MVC只是表现层的模式这句话。说MVC就是3层的,只能说你2者都不了解。

3层的根本目的是满足OCP。 内在矛盾是实现与抽象。如果将来出现了面向对象数据库,那么就少了一层了,呵呵。

  回复  引用  查看    

#19楼  2008-06-15 22:36 姜敏      

太深奥   回复  引用  查看    

#20楼  2008-06-16 08:54 红尘中迷茫      

做个行业网站,曾经用了n个层,最后发现是费力不讨好,都删了,现在只用 一个SQLHelper.cs 和BLL层+Model层。倒也简单,后来把BLL层里重复的东西也删了,都是继承一个BaseDAL里面的GetCount、GetList、Add、Update、Delete之类的方法。没感觉维护起来困难。现在好像是花更多时间在精简,在改变性能。   回复  引用  查看    

#21楼  2008-06-16 13:22 一个农民 [未注册用户]

随着互联网的进化, 在runtime状态下, 对象就需要括展, 所以动态语言最终会战胜静态语言。 No compile, just run.会成为趋势。
  回复  引用    

#22楼  2008-06-16 15:04 老Q      

顶,分哪么多层干吗
SQLHelper + (BLL层+Model层)+ 表现层 足够了。
要分担性能的花,把(BLL层+Model层)做成webservice调用。
这样就可以通过不停的增加(BLL层+Model层)服务器来达到分摊性能的问题。   回复  引用  查看    

#23楼  2008-06-16 18:21 U2U      

呵呵,有标题党之嫌   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
 




导航

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

推荐博客

最新评论

阅读排行榜

评论排行榜