这段时间,看到了很多分层和架构的内容.先谈谈我正在做的项目,可以说这个项目是模仿Petshop,只是客户确定用数据库SLQ Server 2000,不会变,所以没有用什么工厂模式. 可能这个也是目前用的比较多的结构了,做的过程中有个很深的体会,也是让我寻找更好框架的原因,我们的BLL层,根本就没有东西,原因我想应该是应用了SP的缘故,业务逻辑散落在各个角落里.说实话,我挺讨厌SP的(报表除外),我个人也认为,这根本不是真正的面向对象.当你的存储过程达到几百个的时候,当你有很多的连接查询的时候,真是举步为艰!下次如果再用这中架构,如果确定用存储过程,还不如不要BLL层.公司给我们培训架构,讲的仍然是三层,难到.NET里面没有别的了吗?无意中看见了LoveCherry的帖子:小调查,大家现有项目系统构架都是怎么样的? 
http://community.csdn.net/Expert/topic/4937/4937348.xml?temp=.8395655好象真的都在用这种结构,不过LoveCherry在学习NPetshop,里面用到了Castel,用到了MVC模式,
碰巧我也学习了Java里面的Struts,经典的MVC,个人认为,MVC更加强调业务逻辑,Hibernate等一些框架其实都是帮我们解决除了业务以外的问题,让我们有更多的时间去研究实现业务逻辑,建立领域模型.Petshop 太简单了,所以我们忽略了他的业务,我甚至偏激的认为,Petshop的简单"毒害"了很多人,包括我.我想研究NPetshop,看看.Net里面的MVC是什么样子的.不断的思考和不断的总结才能有新的发现,请各位谈谈这方面的感受和一些心得.推荐除Petshop 以外的架构.

解决方案 »

  1.   

    學習!
    Duwamish 也不錯哦!
      

  2.   

    PETSHOP4.0虽然引入了依赖注入但是还是没有ORM,代码非常臃肿,怎么搞的?
      

  3.   

    关于sp,楼主可先看看此贴~
    http://community.csdn.net/Expert/topic/4878/4878075.xml?temp=.9017298
      

  4.   

    学习mvc的同时,别忘了对比mvp哦,我就是用mvp做表示层的,下来就是核心层,下来是orm
      

  5.   

    to:LoveCherry如果有时间,最好能写一些学习NPetshop的文章啊!我找不到.Net里面的除Petshop以外的架构,偶尔看见你推荐的NPetshop,粗略的看了结构,很不错啊!
      

  6.   

    PETSHOP4.0 基本上是3.0的改版,只不过架构根本没有变,我也停失望的.
      

  7.   

    采用Duwamish 吧!不是什么分层你自已应根据系统的需要来分层啊。并不是什么地方的架构都可以拿来用的。
    反思反思
      

  8.   

    Duwamish 个人觉的不如PETSHOP好~
      

  9.   

    http://community.csdn.net/Expert/topic/4947/4947421.xml?temp=.9249689同意楼主,存储过程虽然执行效率高,但是后患无穷。我是在代码中自动拼SQL,SQL采用带参SQL,动态增加命令参数。我做的:1、DataAccess,跨数据访问,专门用于数据存取,已封装
       IDataAccess          数据库打开关闭、执行SQL等
       IDataAccessFactory   工厂,根据配置文件实例多种数据访问,已实现Access、SQLServer、Oracle、DB2、OleDB、ODBC2、EntityAccess,跨数据访问,调用数据访问层,为了与DataAccess实现松耦合,增加了IExeSql接口,因而只要你的数据访问实现了IExeSql接口也行,已封装   IEntityAccess,依赖IEntityFacade,调用IExeSql,是IEntityMap与DB的中间产物,已封装
       IEntityMap,依赖IEntityFacade,调用IEntityAccess的增、删、改查
       IEntityFacade,不用说了,仅仅是对象,这样不像强类型暴露了数据结构这里的命名刚更改为现在这个名,正好和数据访问、中间层、表现层对应3、实体定义与实体管理,实现IEntityFacade、IEntityMap接口或EntityAccess给定的基类
       EntityDefine如PersonEntiy
       例如成员Name,Age,这个名字不一定是数据库中Person表的字段名,这样很好的保护了结构不暴露,UI调用也方便,直接调用person.Name比强类型的dataRow["Name"].ToString()更直接方便,如果用强类型,UI还要了解结构,不爽。
      如果你不会在意像DataSet强类型暴露数据结构,EntityManagement直接继承IEntityFacade的已实现的基本类EntityFacade并实现IEntityMap   EntityManagement如PersonManagement
       调用者自己用成员适配模式定义EntityManagement适配IEntityMap的增删改查,这样就不会暴露数据结构
      如果你不会在意像DataSet强类型暴露数据结构,EntityManagement直接继承IEntityMap或它的基本实现EntityMap类
    4、还有业务外观和业务逻辑,调用EntityManagement,至于逻辑如多个实体对象利用COM+达到事务共享  因为各个对象在不同的数据访问层中提交,但很多时候需要事务,这里启动MSDTS5、用户界面层,直接申明实体如PersonEntiy并用EntityManagement如PersonManagement达到数据存取目的。PersonEntiy仅仅是根据成员读写数据,调用PersonManagement的增删改
    这样,UI不像调用强类型的DataSet还要清楚字段名等,而直接以对象方式存取,屏蔽了数据结构。需要说明的是:
    只要实现EntityAccess的IEntityMap接口,数据存取不用你写一行SQL,自动跨数据访问。-----------------------
    另:大家可以到网上看一看 孙亚民 的文章与他设计的架构,他的架构很不错。实体是继承于DataSet,实体定义是用XML描述的,并说明了Java EntityBean优缺点于是进行改进。但是我觉得最大的弱点就是UI调用实体读写数据的时候,先不说数据结构暴露,但总是要dataRow["字段名"]就感觉不爽。
    之前我也用XML搞过,但是没有孙亚民那样定义的细
    我用XML实际上定义的是Web/Win表单与数据存取之间的关系,也就是说只要你定义了这个XML
    你不用写程序我就可以把Web/Win表单提交到数据库如有兴趣可以一起探讨,在17556475群共享中,有三层示例和我说的 Web/Win表单通用数据存取
      

  10.   

    To:flygoldfish(长江支流)谢谢你的回复.多谢你提供的方法,我会认真思考的.
      

  11.   

    呵呵 我正在学习saf,虽然简单(属于入门的那种)但我想先从简单入手再不断丰富!一下子搞那么深奥的怕自己不能很好理解和接受!
      

  12.   

    看一些开源的project吧
    nhibernate,spring等
      

  13.   

    我现在在学习Java里面的Struts,经典的MVC,
    还没有打算做Java,学习这个只是为了学习一个新的框架,走出去海阔天空.看到了NPetshop,.net里面的MVC,不知道是不是很值得一看了.看来是到了学习一些新东西的时候了,Castle首选,然后是IBatisNet.
      

  14.   

    建议看看UIP 2.0的Store Application的代码,个人认为比Petshop写得更好。
    http://www.microsoft.com/downloads/details.aspx?FamilyID=98c6cc9d-88e1-4490-8bd6-78092a0f084e&DisplayLang=en好多项目都是把业务逻辑直接写入SP,这样的优点是可以提高代码的执行效率,以及便于维护。为了更好的实现组件化,也就是面向对象化,你可以把业务分割成小单元,分别用SP来实现,然后封装成BLL。这样就可以平衡面向对象,代码执行效率以及控制工程成本三方面的需求。
      

  15.   

    ......
    莫非大家都不用代码生成工具么?
    莫非大家都不用UML么?
      

  16.   

    个人意见:存储过程应慎用。除了上面几位说的,它还影响应用的可迁移性。就是在异种数据库上的迁移。
    -------------------------------------------------
    我的BLOG:http://blog.csdn.net/beepbug/
      

  17.   

    现在用的是IBATISNET感觉还可以!3层结构
      

  18.   

    1、
    2、我接触这方面是太久,不过也有些自己的想法,首先我觉得,我们空空的去讨论、评价某一类架构是片面的,甚至是有反面效应的,同时也会误导了其他人。说的大点吧,马克思列宁主义好吗?当然好,但是它能完全的适应我们现在的社会吗?所以我想这个好是有前提条件的,比如在什么历史背景下,在什么样的人文环境下等等...那么我们软件的架构也是一样的,我们不能说PETshop不好,(暂时抛开它是否有缺陷)但是它的好也许只是适应某一类的项目,除了学习其架构我们没有必要在我们的每一个项目开发的时候都去模仿它,最重要还要就我们具体开发的项目的实际情况而定,甚至我觉得把我们的项目分成简单的2层都是没有问题的,在某些情况下也许效果会更好...
      

  19.   

    微软的那些Example只是告诉你可以这么做的,没有叫你照着这么做……
      

  20.   

    http://community.csdn.net/Expert/TopicView3.asp?id=4949724三层架构之我见 —— 不同于一般的三层架构。也许对您会有所启发!看看我写的帖子,也许对您会有所帮助。
      

  21.   

    我们也用三层,ENTITY/DAL/BLL/UI,ENTITY和DAL是用自己写的代码工具生成的。用着也挺顺手。
      

  22.   

    to:Ivony()我也不想照着这个做啊!对于一些根本没有架构师的公司来说,他们不用微软的这个架构,你让他们设计什么?可能是我见识浅薄,我还没有真正看过逃过这个架构的软件.所以我才决心寻找.net里面除了ENTITY/DAL/BLL/UI的架构,这个架构真很容易让人走入烂用存储过程的怪圈,而程序里面的BLL层的代码占了多少呢?
      

  23.   

    当我看见MVC的时候,我才发现,原来数据访问不是必须的.有人也对我说过,其实ASP.NET是更好的MVC,*.aspx.cs就相当与控制器,
    其实这个理解也无可厚非,但是我觉得MVC更加强调的是模型.想想我们的结构*.aspx.cs文件和DAL 有很多文件,BLL 却很少,很大一步分原因是我们太依赖于存储过程.  即使我想把这些业务防入BLL,但是我还是不知道什么是"控制逻辑",什么是业务逻辑. 虽然我知道要建立领域模型,但是又有谁能真正做到呢?其实我发帖的目的一个是寻找除ENTITY/DAL/BLL/UI这种架构,扩展自己的视野,
    二也是想提醒自己和别人,不要什么都加在*.aspx.cs,最好能建立领域模型.如果不能建立领域模型,决定加在*.aspx.cs的时候,加的内容到底是"控制逻辑",还是"业务逻辑".
      

  24.   

    其实早期的petshop是不是楼主所说的MVC,在class文件夹中放着所有实体类,例如item,product...这就是M吧,而在product.aspx.cs文件中实例化一个M中的其实中一个类,例如:Product Pro = new Product();DGList = Pro.getList();...,这就是C,剩下就V就是Product.aspx页面了。我个人愚见,觉得M很像三层中的DAL,C相当BLL,但觉得C比BLL更有业务逻辑味道。
      

  25.   

    to:lincai(Share赖-_-#) 我也觉得你说的很对.
    但是不知道你有没有想过,MVC为何没有数据访问?为何要把Control加上?我想之所以加上Control,是为了解放Model,让我们有更多的精力去解决业务逻辑.
    但是在三层结构里面,根本没有提到Control,当然如果你能在*.aspx.cs实现控制逻辑,在BLL实现业务逻辑,也算是个伪MVC吧!
    但是MVC里面的Model不依赖于任何一层,三层却不一样,这点也是说明了Model很重要吧!
      

  26.   

    应该参照java的struts + spring + hibernate 架构
      

  27.   

    petShop适合做一些小型的项目, 如果是中型或大型项目肯定要给他害死, 我就是受害者啊.JAVA的MVC架构确实比.NET要高明很多.....推荐大家学JSF架构.....
      

  28.   

    一群死脑筋,非要搞个什么BLL出来不可似的,没有BLL会死啊?简单的就是最好的。有些人说什么“JAVA的MVC架构确实比.NET要高明很多”,我不知道你是不懂Java呢还是不懂.NET,ASPX和MVC有本质的区别吗?真是奇怪得很,不爽的时候,搞.NET老说JAVA的那套好,做JAVA的羡慕ASP.NET的简单;要不,就是两者就互相毁谤,.NET说JAVA是垃圾,JAVA说.NET只能做些小项目(CSDN上不是也有人抱怨Struts不适合做大项目吗?)。难道框架就非得要一个萝卜一个坑?我跟你们说,你们还要学习。你们啊,too simple, sometimes naive!好了,我也发泄完了,楼下的继续。
      

  29.   

    ASPX和MVC有本质的区别吗?
    ---------------------------我觉得这两者之间区别很大,或者说根本就不一样.说一点:MVC里面的Model不依赖于任何一层,三层里面的BLL呢?Model不依赖于任何一层, 这点很重要.
      

  30.   

    MVC并不是分层架构。
    我倒是觉得MVC就是Document/View加上Document的Control而来的。将M和C放到一层,将持久层独立的时候就形成了UBD(UI/BLL/DAL)。
    事实上MVC和UBD并不冲突。
      

  31.   

    to:Ivony() 多谢你的提醒,的确 事实上MVC和UBD并不冲突。我想请教一个问题,那你怎么理解*.aspx.cs文件呢?
    *.aspx.cs应该属于UI还是BLL?我现在的理解,*.aspx.cs应该属于UI.ASPX和MVC没有本质的区别吧!如果是我理解错了,请指正,否则别人看了这个帖子,容易产生误解.
      

  32.   

    to:lazyfish(呆呆虫) 中午的时候我细细考虑了一下,    我觉得这两者之间区别很大,或者说根本就不一样这句话应该是不对的.
    正如你所说,本质上这两者是一样的,不同的是我认为MVC更加强调业务.
    目前我的理解,三层还是没有突出业务的重要性,
    微软做好了强大的ASPX,做好的强大的数据访问,可能是让我们有更多的时间去处理业务,但是目前来说,BLL的确很瘦弱,所以我才说"请重视业务逻辑".
      

  33.   

    to:Ivony() *.aspx.cs应该属于UI还是BLL?
      

  34.   

    主要看怎么写,一般我现在做的网站的话,aspx.cs文件里面是纯粹的UI逻辑。
      

  35.   

    个人认为 BLL并没有被荒废 MS在PETSHOP里的应用在暗示着你应该去应用一些高端的工具来做OO分析.
      

  36.   

    1. 不管是APSX,MVC还是N层结构,它们第一要务是用来解耦的,复用和增强维护性的,关业务逻辑屁事?没有ASPX,MVC和N层结构,你们就不需要业务逻辑了?ASP时代是怎么搞的?2. 用了SP就说ASP.NET没有体现BLL,你是不是觉得非得用N多个.CS类,里面有N 多你看不懂的逻辑,然后拼成个BLL.dll,你才认为ASP.NET是BLL高手?兄弟,我认为这纯粹是你的策略问题。如果用了SP,那只能说你的业务逻辑转移到数据库层, 而不是在Web层了(或者其他地方),如果你愿意你完全可以在Web层中实现你的业务逻辑(有个NHibenate的东东不知道好不好用?)。3. aspx/aspx.cs到底是UI还是Controller? 我觉得它们既是view也是controller,这个就和JAVA里的jsp/servlet一样。jsp和servlet是什么关系?jsp主要是用来view的,servlet用来controller,但jsp最终还是要变成servlet的。aspx/aspx.cs也一样,主要是view的,但是不也是最后要变成一个.cs(实现IHttpHander接口) 吗?这个.cs类作用和servlet差不多,因此你也可以说aspx/aspx.cs也是个controller,而且我觉得是很好用的controller.4. 说MVC中的model不依赖任何层(难道不依赖数据库层?),我想你们的意思是说不依赖View和controller吧,难道APSX中的model就依赖ASPX了?如果说依赖了,那是你的model模型还不到家,如果是好的model,放到window form,一样拿来用。
      

  37.   

    to:lazyfish(呆呆虫)谢谢你的提醒,我在之前的帖子中,已经纠正了自己的理解.再请问你一个问题,你会在aspx.cs文件中放入什么内容呢?控制逻辑?
      

  38.   

    aspx.cs只要放UI逻辑,如是否为空,一些表面的逻辑,至于业务逻辑就由逻辑层去做,如多个实体存取要启动事务,数据参照完整性,...,他们再调用DAL
      

  39.   

    看看在什么情况下了,有没有见过一些写书的把所有代码全部放到一个aspx.cs里面的?
    多的很,一个页面可以,两个页面也行,太多页面就不行了,看情况,非得搞个3层n层的那也得看场合,没有最好,只有最合适自己的。屎,有屎存在的道理
    米,有米存在的道理
    燕窝,有米存在的道理你让狗吃燕窝,可以么?
    完全可以,也完全没有必要。
      

  40.   

    aspx.cs只要放UI逻辑
    像这样嘛。
    webform1.aspx.cs里
    if(this.text1.text == "")
    Response.write("gasfasdfsadfsdf")
    if(this.text2.text == "")
    Response.write("dfsadfsdf")
    classa aa = new classa(this.text1.text,this.text2.text)
    aa.getmoney();
    然后在写一个类文件
    在这里定义这个classa这个类嘛。?、、?、、、????????????????
    都是这样做太蠢了吧
    UI逻辑,还有什么逻辑,,哦,业务逻辑在哪,定义一个类文件最后说这个看场合,还是狠对的。。就像用sp,orm哪东东。租的服务器牛一样,你能用orm嘛。
      

  41.   

    邀请各位高手到这里继续讨论!http://community.csdn.net/Expert/TopicView3.asp?id=4957543邀请高手参加 —— 麻烦您结合实例讲解一下您是如何分层的(或者说如何写程序的)。
      

  42.   

    petshop????????????????????,难道别人拿出几年前的东西,我们还当它是宝吗?
      

  43.   

    路过,说几句;
    只关心业务逻辑的架构我认为是好的架构!
    存储过程越简单越好,比如一条select 语句,^_^
    如果架构合理,本人推荐这样使用!存储过程用生成器生成两秒钟搞定.
    稍微有点复杂的语句都不要使用存储过程了,且不说维护代价,看着我都觉得不爽.
    除非涉及到几个表的复杂计算,才值得去考虑.