PetShop

转载 2006年05月25日 11:26:00

先到   http://msdn.microsoft.com/library/en-us/dnbda/html/bdasamppet.asp 下载petshop3.0

 

具体的.NET Project实现列表
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
 
一:Data Access Layer:
    1 PetShop.Utility如下
       ConnectionInfo.cs
       DataProtector.cs
       AssemblyInfo.cs
      这个名字空间有三个类一个是ConnectionInfo用于加密解密数据库连接信息,另一个DataProtector调用了
      Crypt32.dll和kernel32.dll实现一些底层数据安全操作,这个类要在下面的PetShop.XXXDAL名字空间中调用
      ,可见Petshop.Utility只是起到的是数据访问辅助工具的作用。
   2 PetShop.SQLServerDAL ――系统结构图中DAL层中的SqlServer DAL子层实现
      SqlHelper类实际上是封装了关于此系统中数据库操作访问的一些常用功能,其中它还会调用上面的PetShop.Utility中的ConectionInfo类方法加密解密连接字符        串。Account类对用户帐户进行操作如Insert,Update,SignIn,其中这些对数据库的操作,使用了上面的SqlHelper类来实现。
   3 PetShop.IDAL 数据访问接口――对应系统结构图中DAL Interface
       接口是一种系列‘功能'的声明或名单,接口没有实现细节,如下接口IAccount定义也可以看出IAccount只有声明:

using System;

using PetShop.Model;

 

namespace PetShop.IDAL

{

// Inteface for the Account DAL

     public interface IAccount

     {

   // Authenticate a user

         AccountInfo SignIn(string userId, string password);

         /// Get a user's address stored in the database

         AddressInfo GetAddress(string userId);

         /// Insert an account into the database

         void Insert(AccountInfo account);

         /// Update an account in the database

         void Update(AccountInfo Account);

     }

}

 

您只需要调用接口,而不用管接口是如何实现的那么接口没有实现,调用它有什么用?实际上接口的实现是由某个类来做的,那么这里的IAccount接口是由PetShop.SqlServerDAL.Account类或是PetShop.OracleDAL.Account类来实现的,从他们的定义可以看到:

public class Account : IAccount {.......}

  5 PetShop.DALFactory 数据访问工厂
    MSPetShop3.0用工厂模式来实现了对SqlServer和Oracle数据库访问的操作,而用户(business Logic Layer)不用知道也不用关心后台用的是哪一种数据库,它只要用接口就行了,接口中定义了要用的方法,当调用接口时会根据具体的情况再去调用底层数据访问操作。而现在这个DALFactory就是关键,当BLL层要操作数据库时,DALFactory会根据具体情况再去使用本文上面介绍的SqlServerDAL和OracleDAL中的一个。这样系统上层只管调用,而下层来实现细节,上级只管发号施令,下级去干活。对于上层来说实现细节被隐藏了。
    以下是PetShop.DALFactory.Account类的实现:

  namespace PetShop.DALFactory {

    

     /// <summary>

     /// Factory implementaion for the Account DAL object

     /// </summary>

     public class Account

     {

         public static PetShop.IDAL.IAccount Create()     file://<<<<ß----这里返回接口

         {            

              /// Look up the DAL implementation we should be using

              string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];

              string className = path + ".Account";

 

              // Using the evidence given in the config file load the appropriate assembly and class

              return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);

         }

     }

}

  以下则是web.config中<appSettings>节点中的一部分:

<add key="WebDAL" value="PetShop.SQLServerDAL" />

    <add key="OrdersDAL" value="PetShop.SQLServerDAL" /> 

<add key="Event Log Source" value=".NET Pet Shop" />

上面的Create()方法返回IAccount接口,用System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];则可以得到Web.config的<appsettings>节点中的关于系统中应该使用哪个数据访问层(SqlserverDAL还是OracleDAL)的信息。因为我在安装PetShop3.0时选择的是Sqlserver所以在此是:value="PetShop.SQLServerDAL",如果用的是Oracle那就是value="PetShop.OracleDAL" 了吧!而且这个文件也应该是可以更改的。接下来className=path+".Account"返回的应该是PetShop.SQLServerDAL.Account,然后再用Assembly.Load加载PetShop.SQLServerDAL.dll,同时创建PetShop.SQLServerDAL.Account的实例,并以接口(PetShop.IDAL.IAccount)类型返回。这样BLL调用IAccount接口时就会用PetShop.SQLServerDAL.Account类的实现代码。
   6  PetShop.ConfigTool
    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节点中
   7 PetShop.Model   业务实体模型
   类似现在所说的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来处理)

 

 

- 作者: 高首 2004年12月27日, 星期一

你真的了解分层架构吗?——写给被PetShop"毒害"的朋友们

一叶障目 .NET平台上的分层架构(很多朋友称其为“三层架构”),似乎是一个长盛不衰的话题。经常看到许多朋友对其进行分析、探讨、辩论甚至是抨击。笔者在仔细阅读了大量这方面文章后,认为许多朋友在分层架...
  • wgz_wlky
  • wgz_wlky
  • 2016年04月01日 01:19
  • 479

PetShop 4.0的4个数据库说明

PetShop 4.0的4个数据库说明 MSPrtShop4数据库说明  数据库一共有6张表分别是:        AspNet_SqlCacheTablesForChangeNotificat...
  • jay5566
  • jay5566
  • 2011年09月07日 11:39
  • 569

以PetShop为样本代码,阐述如何通过改造它实现一个更合理实用的三层架构。

原标题:.NET三层架构的改进以及通用数据库访问组件的实现 前言 微软的三层架构示例项目PetShop是很多.NET开发人员学习项目开发的经典样本代码,很多人都是直...
  • lishimin1012
  • lishimin1012
  • 2014年01月16日 16:26
  • 1095

PetShop5.0官网源代码下载

转 http://www.52rs.net/ArticleView.aspx?gID=b96c547b-e93b-47f4-b694-279f27566aff 基于.NET Framework ...
  • huanglei0809
  • huanglei0809
  • 2013年09月30日 01:32
  • 2273

c# petshop安装 win7 sql2008

1.更改安装文件的兼容性,http://blog.csdn.net/leelee572/article/details/7363033 2.管理员身份运行, 在安装msi的文件需要使用管理员权限安装。...
  • gaobobo138968
  • gaobobo138968
  • 2015年04月20日 14:10
  • 497

.Net Pet Shop 4 初探之一:初识PetShop4

前言 早就听说.Net Pet Shop是学习ASP.net三层架构体系的最佳实例教材,近日学习中不断接触到三层架构的实例,对这一设计模式一直一知半解的我,决定彻底研究一下.Net Pet Shop...
  • Luckeryin
  • Luckeryin
  • 2008年12月16日 17:38
  • 3324

基于PetShop的数据可视化网站(一):基本结构

项目需要制作一个数据可视化网站,本人从零基础开始进行学习以及实现,这篇BLOG对所学的内容进行简单的总结。...
  • maoyushiren
  • maoyushiren
  • 2016年02月04日 16:29
  • 215

.NET PetShop4.0详解

1.项目概述与架构分析微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家都知道,一直以来,在.NET和Java...
  • tongdoudpj
  • tongdoudpj
  • 2007年06月01日 15:39
  • 2298

petshop4 数据库

petshop4 数据库    petshop4.0一共有四个数据库,分别是MSPetShop4、MSPetShop4Orders、MSPetShop4Profile 、MSPetShop4Servi...
  • laolaowhn
  • laolaowhn
  • 2007年10月11日 11:20
  • 2176

Java小程序——petshop

《Java小程序——petshop》   1.描述:刚学Java写的小程序,用到类的封装,使用。 2.工具:eclipse.exe 3.功能:吃,玩。 /******************...
  • Ivan804638781
  • Ivan804638781
  • 2016年09月07日 11:50
  • 386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PetShop
举报原因:
原因补充:

(最多只允许输入30个字)