深度剖析Duwamish 7.0 (1--数据结构)

数据|数据结构

不好意思啊,让大家久等了,第一次写这种文章,可能没有开心那么专业,废话少说,我们开始:

1.结构概述
Duwamish 7.0 结构分为四个逻辑层:
Web 层
Web 层为客户端提供对应用程序的访问。这一层是作为 Duwamish.sln 解决方案文件中的 Web 项目实现的。Web 层由 ASP.NET Web 窗体和代码隐藏文件组成。Web 窗体只是用 HTML 提供用户操作,而代码隐藏文件实现各种控件的事件处理。

业务外观层
业务外观层为 Web 层提供处理帐户、类别浏览和购书的界面。这一层是作为 Duwamish.sln 解决方案文件中的 BusinessFacade 项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。

业务规则层
业务规则层是作为 Duwamish.sln 解决方案文件中的 BusinessRules 项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。

数据访问层
数据访问层为业务规则层提供数据服务。这一层是作为 Duwamish.sln 解决方案文件中的 DataAccess 项目实现的。
        
在这里,对于Duwamish 7.0的分布式结构我就不再罗嗦了,MSDN写的绝对比我好..

下面就从数据访问层开始解剖,我单独提出Customer这一段进行程序讲解:

1.CustomerData.cs(数据层)
Code:

//----------------------------------------------------------------
// Copyright (C) 2000-2001 Microsoft Corporation
// All rights reserved.
//
// This source code is intended only as a supplement to Microsoft
// Development Tools and/or on-line documentation. See these other
// materials for detailed information regarding Microsoft code samples.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
// FITNESS FOR A PARTICULAR PURPOSE.
//----------------------------------------------------------------

namespace Duwamish7.Common.Data
{
    using System;
    using System.Data;
    using System.Runtime.Serialization;
    
    /// <summary>
    ///     A custom serializable dataset containing customer information.
    ///     <remarks>
    ///         This class is used to define the shape of CustomerData.
    ///     </remarks>
    ///     <remarks>
    ///         The serializale constructor allows objects of type CustomerData to be remoted.
    ///     </remarks>
    /// </summary>
    [SerializableAttribute]
    public class CustomerData : DataSet
    {
        //
        //Customer constants
        //
        /// <value>The constant used for Customers table. </value>
        public const String CUSTOMERS_TABLE = "Customers";
        /// <value>The constant used for Email field in the Customers table. </value>
        public const String EMAIL_FIELD     = "Email";
        /// <value>The constant used for Name field in the Customers table. </value>
        public const String NAME_FIELD      = "Name";
        /// <value>The constant used for Address field in the Customers table. </value>
        public const String ADDRESS_FIELD   = "Address";
        /// <value>The constant used for Country field in the Customers table. </value>
        public const String COUNTRY_FIELD   = "Country";
        /// <value>The constant used for Password field in the Customers table. </value>
        public const String PASSWORD_FIELD  = "Password";
        /// <value>The constant used for PhoneNumber field in the Customers table. </value>
        public const String PHONE_FIELD     = "PhoneNumber";
        /// <value>The constant used for Fax field in the Customers table. </value>
        public const String FAX_FIELD       = "Fax";
        /// <value>The constant used for PKId field in the Customers table. </value>
        public const String PKID_FIELD      = "PKId";
        //
        // Error messages
        //
        /// <value>The constant used for row error when 'Email Not Unique' field in CustomerData. </value>
        public const String EMAIL_FIELD_NOT_UNIQUE     = "Email Not Unique";
        /// <value>The constant used for row error when 'Email Invalid Format' field in CustomerData. </value>
        public const String EMAIL_FIELD_INVALID_FORMAT = "Email Invalid Format";
        /// <value>The constant used for row error when there is an 'Invalid Field' in CustomerData. </value>
        public const String INVALID_FIELD              = "Invalid Field";
        /// <value>The constant used for error when 'Invalid Fields' exist in CustomerData. </value>
        public const String INVALID_FIELDS             = "Invalid Fields";

        /// <summary>
        ///     Constructor to support serialization.
        ///     <remarks>Constructor that supports serialization.</remarks>
        ///     <param name="info">The SerializationInfo object to read from.</param>
        ///     <param name="context">Information on who is calling this method.</param>
        /// </summary>
        public CustomerData(SerializationInfo info, StreamingContext context) : base(info, context)
        {        
        }        
        
        /// <summary>
        ///     Constructor for CustomerData.  
        ///     <remarks>Initialize a CustomerData instance by building the table schema.</remarks>
        /// </summary>
        public CustomerData()
        {
            //
            // Create the tables in the dataset
            //
            BuildDataTables();
        }
                
        //----------------------------------------------------------------
        // Sub BuildDataTables:
        //   Creates the following datatables: Customers
        //----------------------------------------------------------------
        private void BuildDataTables()
        {
            //
            // Create the Customers table
            //
            DataTable         table   = new DataTable(CUSTOMERS_TABLE);
            DataColumnCollection columns = table.Columns;
        
            DataColumn Column = columns.Add(PKID_FIELD, typeof(System.Int32));
            
            Column.AllowDBNull = false;
            Column.AutoIncrement = true;
            
            columns.Add(EMAIL_FIELD, typeof(System.String));
            columns.Add(PASSWORD_FIELD, typeof(System.String));
            columns.Add(NAME_FIELD, typeof(System.String));
            columns.Add(ADDRESS_FIELD, typeof(System.String)).AllowDBNull= false;
            columns.Add(COUNTRY_FIELD, typeof(System.String)).AllowDBNull= false;
            columns.Add(PHONE_FIELD, typeof(System.String)).AllowDBNull= false;
            columns.Add(FAX_FIELD, typeof(System.String));
        
            this.Tables.Add(table);
        }
    
    } //class CustomerData
    
} //namespace Duwamish7.Common.Data

大家可以看到,这里的CustomerData类继承与DataSet,详细定义字段名称以及有可能产生的出错信息,
并同时绘制出一张空表格。
OK,这里的代码非常简单,大家一看应该就可以明白。代码的技巧性非常强,以后的数据访问、交换、传递全部通过这里进行。
私底下认为,采用这种方法有利于团队协作,代码编辑也很简单。
但是,微软自己也说过dataset的效率没有datareader高,而dataset的灵活性远远超过于datareader,真搞不懂MS在企业事例中为什么采用Dataset,也许只是让我们学习其中的思想吧。
过两天再和大家谈谈另一种方法,采用datareader,效率高点,但是代码太难看,难懂:(

时间: 2024-10-03 07:51:18

深度剖析Duwamish 7.0 (1--数据结构)的相关文章

DOCTYPE 标签的深度剖析以及使用选择

  <!DOCTYPE>的定义: <!DOCTYPE>声明位于文档中的最前面的位置,处于<html>标签之前.此标签可告知浏览器文档使用哪种HTML或XHTML规范. 该标签可声明三种DTD类型,分别表示严格版本.过渡版本以及基于框架的HTML版本.(假如文档中的标记不遵循doctype声明所指定的DTD,这个文档除了不能通过代码校验之外,还有可能无法在浏览器中正确显示.) <!DOCTYPE>的用法: <!DOCTYPE html PUBLIC &q

深度剖析Struts2远程代码执行漏洞

本文讲的是深度剖析Struts2远程代码执行漏洞, 三月初,安全研究人员发现世界上最流行的JavaWeb服务器框架之一– Apache Struts2存在远程代码执行的漏洞,Struts2官方已经确认该漏洞(S2-046,CVE编号为:CVE-2017-5638)风险等级为高危漏洞. 漏洞描述 该漏洞是由于上传功能的异常处理函数没有正确处理用户输入的错误信息,导致远程攻击者可通过修改HTTP请求头中的Content-Type值,构造发送恶意的数据包,利用该漏洞进而在受影响服务器上执行任意系统命令

block深度剖析

title: block深度剖析 date: 2016-04-18 23:46:43 tags: block 分两部分内容来剖析block: 怎么用 为什么这么用 block的堆栈 分类: 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock. NSGlobalBlock:类似函数,位于text段: NSStackBlock:位于栈内存,函数返回后Block将无效: NSMallocBlock:位于堆内存.需要开发者进行释放.

《Photoshop混合模式深度剖析》—第2章构建参考图像

构建参考图像 Photoshop混合模式深度剖析 实现色彩混合或是其他效果的方法有很多,很多人更习惯于处理真实的照片,但我更喜欢通过抽象的示意图来解决问题.因此,我需要建立示例文件,并调整各种参数以实现预期的效果,这样就不会受到真实照片中复杂色彩的干扰.使用这种方法的关键是,注意操作和根据色彩及其他调整而生成的结果之间的关系.尽管可以设计许多其他文件和方案,但最好的测试方法通常是处理自己想要调整的图像.将参考文件放在触手可及之处,或者是在灵感来临时构建参考文件,这是更好地处理具体图像的一种方式.

深度剖析ConcurrentHashMap源码

概述 你可能会在一些技术类的书籍上看到下面这样一段关于HahsMap和Hashtable的表述: HashMap是非线程安全的,Hashtable是线程安全的. 不知道大家有什么反应,我当时只是记住了,知道面试的时候能回答上来就行了-至于为什么是线程安全的,内部怎么实现的,却不怎么了解. 今天我们将深入剖析一个比Hashtable性能更优的线程安全的Map类,它就是ConcurrentHashMap,本文基于Java 7的源码做剖析. ConcurrentHashMap的目的 多线程环境下,使用

SAP董玢:SAP HANA内存平台深度剖析

文章讲的是SAP董玢:SAP HANA内存平台深度剖析,2013年4月18-20日,第四届中国数据库技术大会(DTCC 2013)在北京福朋喜来登酒店拉开序幕.在为期三天的会议中,大会将围绕大数据应用.数据架构.数据管理(数据治理).传统数据库软件等技术领域展开深入探讨,并将邀请一批国内顶尖的技术专家来进行分享.本届大会将在保留数据库软件应用实践这一传统主题的基础上,向大数据.数据结构.数据治理与分析.商业智能等领域进行拓展,以满足于广大从业人士和行业用户的迫切需要. 自2010年以来,国内领先

深度剖析消息反射机制

深度剖析消息反射机制作者:hustli    摘要:在前面我们分析了控件通知消息WM_NOTIFY,和WM_NOTIFY紧密联系的还有一个MFC新特性:消息反射.本文中,我想就这个问题作一个全面的论述,如果有错误,还望各路大虾批评指正.    什么是消息反射?    在windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR.对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射

Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究了一套逻辑,这是一整套的2048游戏从设计到逻辑再到编写的全部过程,小伙伴们看仔细咯,刚好今天是礼拜天,一天应该了一把这篇博客发表了,其实2048开发起来还是有点难度的,并且他的逻辑挺强的,我也是看了很多的资料偷学的,很适合来锻炼自己的逻辑性 我们首先先来选择开发环境,这里我们就以Eclipse为I

深度剖析百度百科单页高排名的内因

百度百科在seoer心中一直是个神话,单页高排名.如何能使自己的网站做到向百科这样的优,走进百科代码,深度剖析百度百科单页高排名的内因. 一.Title Description Keywords如何写   从这个图片中可以看出,百度百科提倡精简不臃肿的title书写方式,而不是现在大家追求的关键词堆叠,其次大家可能也发现了,description和keywords都已经不存在了,只有标题,显示在搜索引擎中的描述都是自动提取网页的前一部分.也就是说你可以完全忽略你的后两项. 二.LOGO如何用