它们之间数据层都差不多,倒没有想的
在中间层它们差别还是比较大,在web site高级编程中,看过的应该都知道,定义的类一般都是私有成员对应相应表的字段,然后就是方法访问成员,在这里实体类用的很少,在petshop中好像都是以实体类为核心一样,在表示层做好实体类,然后一层一层向下到数据层,返回值也是一层一层向上到表示层,中间层的类好像没什么用一样,只是从中间过趟路而已,我现在晕了,看了一下Duwamish,一样,中间层连一个私有成员变量都没有,还有没web site高级编程那么oo,中间层到底应该怎么写呢?
上面两种情况就应该怎么选择呢?希望高手给一些建议,实体类来自于数据库表的应射,我觉得它们之间应该有一对一和一对多关系,或者多对多关系,定义它们的关系难道就像petshop那样,在一个实体类中定义另一个实体类的数组吗?
希望高手给一些指教,刚到一家新公司,要做的项目既有web site高级编程的影子又有petshop的影子,看的头都是晕的

解决方案 »

  1.   

    我觉得Duwamish比petshop来的朴素和实在,
    你要是写一个企业应用建议参考Duwamish。中间层连一个私有成员变量都没有
    ------------------------------
    这个你指的是?
    本来分层的意思就是明确逻辑,而像duwamish这样的范例把数据库操作全部封装到存储过程,
    当然中间层只是过路了。这样的一个明显好处就是易维护,我们公司已经开发了几个系统,现在想想Duwamish的结构真是不错。
      

  2.   

    http://blog.csdn.net/younther/archive/2003/03/25/20164.aspx
      

  3.   

    如果你以前没有很多N-Tie的经验,建议还是用website 高级编程的吧,思路简单清晰,开发起来快.
      

  4.   

    我的公司也正在参考duwamish这样的范例做系统,再我所接触的分层设计中我觉得他的解决方案是最实用的 ,把把数据库操作全部封装到存储过程,数据访问层调用实体层,逻辑层调用业务数据访问层,结构清晰,利于维护
      

  5.   

    我公司的项目也是参考duwamish,把数据访问全部封装在类,大部分通过存储过程访问数据库。这样维护起来比较方便。
      

  6.   

    正是因为数据库访问都封装成类了,我就想知道中间层都干些什么,在petshop中我觉得中间层没有什么东西,只是表示层从中间层过趟路直接到数据层而已,这样做,还不如做两层算了,在petshop中,感觉要不是因为有个工厂模式在那儿要在中间层搞一下,大家说中间层都做什么了,
    难道大家做系统都是这样中间层只是用来过趟路用的吗?
      

  7.   

    我们公司上一个项目就是参考Duwamish,其实分层就是为了提高代码的可维护性,以及系统的可重用性.
      

  8.   

    .NET Petshop详解(三):petshop三层结构之MiddleTire
    作者:Youther
      通过前面的文章,我们对.NET Petshop的整个结构有了一个大致的了解,也清楚的知道了数据库的设计模式和实现的细节,尤其值得一提的是通过存储过程访问数据库。在接下来的这篇文章里,我将和大家一起来探究一下.NET Petshop的中间层。根据三层结构的设计原则,中间层封装的是业务逻辑和规则,在这个网络宠物商店的例子中,购物处理,订单处理,帐号管理,产品查询等等都是具体的业务逻辑,至于与用户交互并不是中间层要处理的问题。它处理是与具体的用户界面和交互无关,而仅仅是核心的商业规则和逻辑。.NET Petshop的中间层业务逻辑被封装为一个.NET 组件,它的命名空间为Pet Shop.Components(编译后在bin的文件夹里面有一个petshop.dll的文件)。图1是.NET Petshop解决方案中间层的类视图和文件视图。
      图1:.NET Petshop解决方案中间层的类视图和文件视图 接下来,我们模拟顾客到百货超市采购日常用品的过程来说明运作的流程以及抽象出重要的概念(实际上User case,我们在领域分析的时候会这么做,并且是很重要的一步,从这里可以初步的发现在我们实施的系统中将要涉及到的逻辑实体,进而可以为数据库建模设计以及类设计提供参考)。购物用例的业务分析:1 客户有购买商品的意愿;2 客户到登陆管理员处登记,且成功登记;3 在登记处推一个购物车;4 在超市内查找所购商品类别存放的货架;5 在具体的货架上查找某一具体品牌的商品;6 将符合意愿的商品放入自己的购物车;7 重复4-6;8 购物完毕;9 到付款处计算总价格并付款;10 打印购物清单;11 退还购物车;12 取走购物,购物完毕; 备注:在这个用例中,我们做了一些前提和假设,为的是方便.NET Petshop的分析,比如说在实际生活中根本就不需要第二步。 通过这个用例的分析,我们至少可以抽象出一下几个重要概念,并且能在应用程序里面找到对应的类:客户对应Customer、商品对应Product、购物车对应ShoppingCart、商品类别对应Category、具体商品对应Item、清单对应Order。正如我前面说过的,这几个概念对于我们的业务建模和系统建模是非常有用的。正是通过这样的分析,在.NET Petshop的业务逻辑里面共有9个核心类和5个轻量级的数据结构类。同样的方式,我在这里列出这些类,并加以说明(见表1)。 类名称
     说明
     
    BasketItem
     代表购物车ShoppingCart里的一项购物商品。
     
    Customer
     用于帐号管理和登陆验证。
     
    CustomerDetails
     用户帐号的详细信息。
     
    CustomerAddress
     用户帐号的地址信息。
     
    Error
     用于登陆出错的帮助功能。
     
    Item
     代表某类产品中的具体一项商品。
     
    ItemResults
     搜索Item的结果集。
     
    Order
     购物完毕后的购物清单和订单。
     
    Product
     大类别里面的某类产品。
     
    ProductResults
     搜索产品的结果集。
     
    Profile
     用户的配置。
     
    ShoppingCart
     购物车,用于购物的整个过程,直到下订单。
     
    Database
     通过ADO.NET访问数据库,封装了具体的访问方法。
     
    SearchResults
     模糊搜索的结果集。
     
      

  9.   

    表1:.NET Petshop中间层的类 CustomerAddress, CustomerDetails, ItemResults, ProductResults, and SearchResults这几个轻量级的数据结构类为在数据层和展示层之间提供了一种松散的数据绑定调用。这些类都被设计为有公开的属性,ASP.NET 的web页面可以通过这些属性访问数据。下面这段类的代码说明了这5个类是如何暴露自己的公开属性供展示层使用的。 public class ProductResults        {              private string m_productid;              private string m_name;               public string productid {                     get { return m_productid; }                     set { m_productid = value; }                }              public string name {                     get { return m_name; }                     set { m_name = value; }                }       } 在.NET Petshop详解(二)中我们就说过数据库的访问是通过存储来进行的,我们看看下面这部分代码就知道了:        public string Login(string userName, string password) {                     string customerID;                      // params to stored proc                     Database data = new Database();                     SqlParameter[] prams = {                            data.MakeInParam("@username",    SqlDbType.VarChar, 25, password),                            data.MakeInParam("@password",    SqlDbType.VarChar, 25, userName),                            data.MakeOutParam("@CustomerID", SqlDbType.VarChar, 25)                     };                      // create data object and params                     data.RunProc("upAccountLogin", prams);    // run the stored procedure                     customerID = (string) prams[2].Value;     // get the output param value                      // if the customer id is an empty string, then the login failed                     if (customerID == string.Empty)                            return null;                     else                            return customerID;              } 这段代码是Customer类的Login方法,它是通过将用户输入的用户名userName和密码password做为输入参数传递给存储过程upAccountLogin的,这个存储过程完成在Sigon用户帐号表里面查找该用户是否合法,最后返回一个字符串的用户ID值。在这里没有使用SQL查询语句,很好的分离了逻辑。具体的数据库访问是通过Database来完成的,我们将在后面的文章中继续探讨它的运作。ShoppingCart是比较有意思的一个类,也是很重要的一个类。它是与状态有关的一个类,在.NET Petshop里面,它的状态是通过ASP.NET Session state来管理的,关于其进一步的细节留待后面讨论。.NET Petshop的中间层的探讨先到此,我在这里只是抛砖引玉,很多的东西要深入代码才可以搞的更加清楚。欢迎大家继续与我一起关注下一篇.NET Petshop的数据展示层。
      

  10.   

    PetShop和Duwamish的不同之处如下:
    数据载体:实体类,DataSet
    数据访问:SQL语句,存储过程二者的中间层都是进行数据的有效性验证,在多层开发中,数据安全性是非常重要的,对于关键数据应当在多个层次中进行验证,就相当于有多道“防火墙”一样。并非如你所说,没有作用。使用PetShop的实体类进行操作,不需要ADO.NET方面的知识,编程比较简单,但在数据读取的时候比较烦琐,而且其必须关联数据库的字段类型,不能有一个出错。而是Duwamish的DataSet进行操作,其会自动关联数据类型,在数据库变动后,维护修改,调试方面可操作性较强。在企业级开发中,推荐使用Duwamish。