PetShop的业务逻辑层的类文件在Components文件中,我怎么找不到数据层呢?

解决方案 »

  1.   

    Components文件夹下Database.cs就是它的数据层
    用RunProc函数读取数据
      

  2.   

    最近对多层设计实现和.Net产生了兴趣,从而研究了一下比较著名的多层范例程序――PetShop,现在的版本是3.0,和以前的版本从设计上已有一定的区别,应该是和Java的Petshop设计相当。关于一些Microsoft PetShop的来由、如何安装,所表现业务流程,数据库表结构等基本的信息的资料请大家参考下面文章 http://msdn.microsoft.com/library/en-us/dnbda/html/bdasamppet.asp 另外建议先看一下这篇文章:http://msdn.microsoft.com/library/en-us/dnbda/html/petshop3x.asp  (如有格式问题本文可到http://www.surfsky.com/bbs/myfiles/MSPetShop3.0%20Report.doc下载) 本文将以设计和实现紧密结合的方式来分析,这也是我们广大实践型的软件开发人员的风格。先看一下设计图和具体实现VS.NET工程的表格。 MSPetShop 3.0 系统结构图:
    从图中可以看到系统大体分为Presentation,Business Logic,Data Access 三层,每层中又有子层。每层(也包括子层)各司其职,又互相协作,本文顺序以此图为准,从下到上分析。 对应上图,具体的.NET Project实现列表(借用MS文章中的列表不用翻译了吧)Project
     Purpose
     
    BLL
     Home for business logic components
     
    ConfigTool
     Administration application used to encrypt connection strings and create event log source
     
    DALFactory
     Classes used to determine which database access assembly to load
     
    IDAL
     Set of interfaces which need to be implemented by each DAL implementation
     
    Model
     Thin data classes or business entities
     
    OracleDAL
     Oracle specific implementation of the Pet Shop DAL which uses the IDAL interfaces
     
    Post-Build
     Project to run post compile actions such as adding assemblies to the GAC or COM+
     
    Pre-Build
     Project to remove assemblies from the GAC or unregister assemblies from COM+
     
    SQLServerDAL
     Microsoft SQL Server specific implementation of the Pet Shop DAL which uses the IDAL interfaces
     
    Utility
     Set of helper classes including a wrapper for the DPAPI
     
    Web
     Web pages and controls
     
    Solution Items
     Miscellaneous items used to build the application such as Pet Shop.snk key file used to sign application assemblies
      
      

  3.   

    首先在..\Microsoft\PetShop\ConfigTool\中有一个app.config文件,看一下其中内容,分别定义了两种数据库的联接字符串,在app.config中有一行  <add key="WebConfigFileLocation" value="Web\Web.config" /> 则标识出给asp.net程序使用的web.config配置文件的相对位置。然后看一下PetShopConnectionString的EncryptConnectionString方法的源码,这个类中先是从当前目录的app.config文件中读出web.config文件的位置,如下:public static readonly string CONFIGFILE = ConfigurationSettings.AppSettings["WebConfigFileLocation"]; 然后语句XmlDocument doc = new XmlDocument();doc.Load(CONFIGFILE);加载Web.config文件,最后将加密的连接字符串写入Web.config对应的XML节点中。以供Asp.net应用程序使用。其中的加密还是使用PetShop.Utility。而ConfigConsole,调用PetShopConnectionString类EncryptConnectionString执行对联接字符串进行加密。另外PetShopEventLog类也是在ConfigConsole中使用的。用于记录程序日志。所以在最后部署时Web.config的连接字符串是加密的。 7 PetShop.Model   业务实体模型
    http://www.surfsky.com/bbs/myfiles/7.bmp   这个本来想在分析BLL层时再说,但是在SqlServerDAL和OracleDAL中都使用了这些Model,无论怎么样,上层的程序执行最终结果都是要操作数据库,而数据库是关系型,不是面向对象的,那就得把平面的‘表’结合业务规则抽象成类,这样想办法让上层(BLL及以上)以为自已在操作类而不是数据库表,从而使‘它们’感觉没有数据库的存在,上层只管面向对象编程就可以了。类似现在所说的O-R MAPPING,但O-R MAPPING比这种简单的数据到对象的持久化要复杂。据说可以在表结构有变化的情况下,上层应用程序代码不用更改,只要改O-R MAPPING的相关设置就可以了。   上面第2节中已看到Petshop的SqlServerDal和OracleDal中定义的sql语句,然后根据上层的调用,把sql语句传给SqlHelper执行,再来看看SqlServerDal的一段程序:     private void SetAccountParameters(SqlParameter[] parms, AccountInfo acc) {              parms[0].Value = acc.Email;              parms[1].Value = acc.Address.FirstName;              parms[2].Value = acc.Address.LastName;              parms[3].Value = acc.Address.Address1;              parms[4].Value = acc.Address.Address2;              parms[5].Value = acc.Address.City;              parms[6].Value = acc.Address.State;              parms[7].Value = acc.Address.Zip;              parms[8].Value = acc.Address.Country;              parms[9].Value = acc.Address.Phone;              parms[10].Value = acc.UserId;         }parms[x]就是那些有声明为常量的有参数的Sql语句中的参数,这里用Model中的AccountInfo的各Field和这些参数Mapping。所以对于BLL层,只知道这些Model就可以了,反正最后在SqlServerDAL或是OracleDAL中Model的成员们会Mapping到参数中以存取数据库(为什么不直接Mapping到数据集的字段呢?我想应该是因为这里数据库操作直接给SqlHeper的原因,不然就没必要用SqlHelper了。于是才又多了图中的xxx DAAB层,这样Mapping给参数再传给DAAB来处理) Data Access Layer总结:  DAL完成数据库访问任务,上层(BLL)直需调用接口即可,不用知道具体访问细节,用Factory模式来实现,使用运行时读取web.config的方法来得到连接配置信息,最后选用SqlServerDAL或OracleDAL之一的相对具体子层,同时使用SqlHelper或OraHelper之一来完成数据库操作。
      

  4.   

    参考--
    http://www.microsoft.com/china/community/Column/67.mspx讲的很详细,看一遍就会有大概的了解了。