PetShop4分析随手贴

 

PetShop4 简析
 
 
跟踪顺序为
1.Web/Controls/ItemsControl.ascx.cs
2./BLL/Item.cs (此处用工厂实现下面的Item)
3./IDAL/IItem.cs
/DALFactory/DataAccess.cs(工厂)
/Web/web.config(path)
/SQLServerDAL/Item.cs(IItem的实现类)
 
 
具体代码实现如下(UI->BLL->DAL)

Web/Controls/ItemsControl.ascx.cs
using System;
using System.Web;
using System.Web.UI.WebControls;
using PetShop.BLL;
using PetShop.CacheDependencyFactory;
 
namespace PetShop.Web {
    public partial class ItemsControl : System.Web.UI.UserControl {
       
        ///<summary>
        /// Rebind control
        ///</summary>
        protected void PageChanged(object sender, DataGridPageChangedEventArgs e) {
            //reset index
            itemsGrid.CurrentPageIndex = e.NewPageIndex;
 
            //get category id
            string productKey = Request.QueryString["productId"];
 
            //bind data           
            Item item = new Item();
            itemsGrid.DataSource = item.GetItemsByProduct(productKey);
            itemsGrid.DataBind();
 
        }
    }
}
 
/BLL/Item.cs
using System.Collections.Generic;
using PetShop.Model;
using PetShop.IDAL;
 
namespace PetShop.BLL {
 
    ///<summary>
    /// A business component to manage product items
    ///</summary>
    public class Item {
 
        // Get an instance of the Item DAL using the DALFactory
        // Making this static will cache the DAL instance after the initial load
        private static readonly IItem dal = PetShop.DALFactory.DataAccess.CreateItem();
                
         ///<summary>
         /// A method to list items by productId
         /// Every item is associated with a parent product
         ///</summary>
         ///<param name="productId">The productId to search by</param>
         ///<returns>A Generic List of ItemInfo</returns>
         public IList<ItemInfo> GetItemsByProduct(string productId) {
 
              // Validate input
              if(string.IsNullOrEmpty(productId))
                   return new List<ItemInfo>();
 
              // Use the dal to search by productId
              return dal.GetItemsByProduct(productId);
         }
 
        ///<summary>
        /// Search for an item given it's unique identifier
        ///</summary>
        ///<param name="itemId">Unique identifier for an item</param>
        ///<returns>An Item business entity</returns>
        public ItemInfo GetItem(string itemId) {
 
            // Validate input
            if (string.IsNullOrEmpty(itemId))
                return null;
 
            // Use the dal to search by ItemId
            return dal.GetItem(itemId);
        }
    }
}
 
 
/IDAL/IItem.cs
using System;
using System.Collections.Generic;
 
//References to PetShop specific libraries
//PetShop busines entity library
using PetShop.Model;
 
namespace PetShop.IDAL {
 
     ///<summary>
     /// Interface to the Item DAL
     ///</summary>
     public interface IItem{
        
         ///<summary>
         /// Search items by productId
         ///</summary>
         ///<param name="productId">ProductId to search for</param>
        ///<returns>Interface to Model Collection Generic of the results</returns>
         IList<ItemInfo> GetItemsByProduct(string productId);
 
         ///<summary>
         /// Get information on a specific item
         ///</summary>
         ///<param name="itemId">Unique identifier for an item</param>
         ///<returns>Business Entity representing an item</returns>
         ItemInfo GetItem(string itemId);
     }
}
 
/DALFactory/DataAccess.cs
 
using System.Reflection;
using System.Configuration;
 
namespace PetShop.DALFactory {
 
    ///<summary>
    /// This class is implemented following the Abstract Factory pattern to create the DAL implementation
    /// specified from the configuration file
    ///</summary>
    public sealed class DataAccess {
 
        // Look up the DAL implementation we should be using
        private static readonly string path = ConfigurationManager.AppSettings["WebDAL"];
        private static readonly string orderPath = ConfigurationManager.AppSettings["OrdersDAL"];
       
        private DataAccess() { }
 
        public static PetShop.IDAL.ICategory CreateCategory() {
            string className = path + ".Category";
            return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
        }
 
        public static PetShop.IDAL.IInventory CreateInventory() {
            string className = path + ".Inventory";
            return (PetShop.IDAL.IInventory)Assembly.Load(path).CreateInstance(className);
        }
 
        public static PetShop.IDAL.IItem CreateItem() {
            string className = path + ".Item";
            return (PetShop.IDAL.IItem)Assembly.Load(path).CreateInstance(className);
        }
 
        public static PetShop.IDAL.IOrder CreateOrder() {
            string className = orderPath + ".Order";
            return (PetShop.IDAL.IOrder)Assembly.Load(orderPath).CreateInstance(className);
        }
 
        public static PetShop.IDAL.IProduct CreateProduct() {
            string className = path + ".Product";
            return (PetShop.IDAL.IProduct)Assembly.Load(path).CreateInstance(className);
        }
 
    }
}
 
 
/Web/web.config
 
<? xml version = "1.0"?>
< configuration xmlns = "http://schemas.microsoft.com/.NetConfiguration/v2.0">
     < connectionStrings configProtectionProvider = "RsaProtectedConfigurationProvider">
         < EncryptedData Type = "http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#">
              < EncryptionMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
              < KeyInfo xmlns = "http://www.w3.org/2000/09/xmldsig#">
                   < EncryptedKey xmlns = "http://www.w3.org/2001/04/xmlenc#">
                       < EncryptionMethod Algorithm = "http://www.w3.org/2001/04/xmlenc#rsa-1_5"/>
                       < KeyInfo xmlns = "http://www.w3.org/2000/09/xmldsig#">
                            < KeyName > Rsa Key</KeyName>
                       </ KeyInfo >
                       < CipherData >
                            < CipherValue > NrTRoEqZ1heJDQKp5vLf/vfn+JwusYDwL7c9QFU3FJTeRikKLKaT5Rsa27NzCuU3N9ClxOXBc8hz8h9xO/2LRczJGqAopjhNF77YCV3n28oAXZEC44ePtUQpDhgq9u5EkLkRrBR8zuXidyhU5g0ORGYXtse05jRsZLiNWRpoAyg=</CipherValue>
                       </ CipherData >
                   </ EncryptedKey >
              </ KeyInfo >
              < CipherData >
                   < CipherValue > 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</CipherValue>
              </ CipherData >
         </ EncryptedData >
     </ connectionStrings >
     < appSettings >
         <!-- Pet Shop DAL configuration settings. Possible values: PetShop.SQLServerDAL for SqlServer, PetShop.OracleServerDALfor Oracle. -->
         < add key = "WebDAL"value="PetShop.SQLServerDAL"/>
         < add key = "OrdersDAL"value="PetShop.SQLServerDAL"/>
         < add key = "ProfileDAL"value="PetShop.SQLProfileDAL"/>
         <!-- Enable data caching -->
         < add key = "EnableCaching"value="true"/>
         <!-- Cache duration (in hours-whole number only) -->
         < add key = "CategoryCacheDuration"value="12"/>
         < add key = "ProductCacheDuration"value="12"/>
         < add key = "ItemCacheDuration"value="12"/>
         <!-- Cache dependency options. Possible values: PetShop.TableCacheDependency for SQL Server and keep empty for ORACLE -->
         < add key = "CacheDependencyAssembly"value="PetShop.TableCacheDependency"/>
         <!-- CacheDatabaseName should match the name under caching section, when using TableCacheDependency -->
         < add key = "CacheDatabaseName"value="MSPetShop4"/>
         <!-- *TableDependency lists table dependency for each instance separated by comma -->
         < add key = "CategoryTableDependency"value="Category"/>
         < add key = "ProductTableDependency"value="Product,Category"/>
         < add key = "ItemTableDependency"value="Product,Category,Item"/>
         <!-- Order processing options (Asynch/Synch) -->
         < add key = "OrderStrategyAssembly"value="PetShop.BLL"/>
         < add key = "OrderStrategyClass"value="PetShop.BLL.OrderSynchronous"/>
         <!-- Asynchronous Order options -->
         < add key = "OrderMessaging"value="PetShop.MSMQMessaging"/>
         < add key = "OrderQueuePath"value="FormatName:DIRECT=OS:MachineName/Private$/PSOrders"/>
         <!-- Application Error Log -->
         < add key = "Event Log Source"value=".NET Pet Shop 4.0"/>
     </ appSettings >
     < system.web >
         < pages theme = "PetShop"styleSheetTheme="PetShop"/>
         <!--
            Set compilation debug="true" to insert debugging
            symbols into the compiled page. Because this
            affects performance, set this value to true only
            during development.
        -->
         < compilation debug = "false">
              < assemblies >
                   < add assembly = "System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                   < add assembly = "System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                   < add assembly = "Accessibility, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
                   < add assembly = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies></compilation>
         <!--
            The <authentication> section enables configuration
            of the security authentication mode used by
            ASP.NET to identify an incoming user.
         -->
         < authentication mode = "Forms">
              < forms name = "PetShopAuth"loginUrl="SignIn.aspx"protection="None"timeout="60"/>
         </ authentication >
         <!--
            The <customErrors> section enables configuration
            of what to do if/when an unhandled error occurs
            during the execution of a request. Specifically,
            it enables developers to configure html error pages
            to be displayed in place of a error stack trace.
        -->
         < customErrors defaultRedirect = "Error.aspx"mode="RemoteOnly"/>
         < sessionState mode = "Off"/>
         < anonymousIdentification enabled = "true"/>
         < profile automaticSaveEnabled = "false"defaultProvider="ShoppingCartProvider">
              < providers >
                   < add name = "ShoppingCartProvider"connectionStringName="SQLProfileConnString"type="PetShop.Profile.PetShopProfileProvider"applicationName=".NET Pet Shop 4.0"/>
                   < add name = "WishListProvider"connectionStringName="SQLProfileConnString"type="PetShop.Profile.PetShopProfileProvider"applicationName=".NET Pet Shop 4.0"/>
                   < add name = "AccountInfoProvider"connectionStringName="SQLProfileConnString"type="PetShop.Profile.PetShopProfileProvider"applicationName=".NET Pet Shop 4.0"/>
              </ providers >
              < properties >
                   < add name = "ShoppingCart"type="PetShop.BLL.Cart"allowAnonymous="true"provider="ShoppingCartProvider"/>
                   < add name = "WishList"type="PetShop.BLL.Cart"allowAnonymous="true"provider="WishListProvider"/>
                   < add name = "AccountInfo"type="PetShop.Model.AddressInfo"allowAnonymous="false"provider="AccountInfoProvider"/>
              </ properties >
         </ profile >
         <!-- Membership Provider for SqlServer -->
         < membership defaultProvider = "SQLMembershipProvider">
              < providers >
                   < add name = "SQLMembershipProvider"type="System.Web.Security.SqlMembershipProvider"connectionStringName="SQLMembershipConnString"applicationName=".NET Pet Shop 4.0"enablePasswordRetrieval="false"enablePasswordReset="true"requiresQuestionAndAnswer="false"requiresUniqueEmail="false"passwordFormat="Hashed"/>
              </ providers >
         </ membership >
         <!-- Membership Provider for Oracle -->
         <!--
         <membership defaultProvider="OracleMembershipProvider">
              <providers>
                   <clear/>
                   <add name="OracleMembershipProvider"
                       type="PetShop.Membership.OracleMembershipProvider"
                       connectionStringName="OraMembershipConnString"
                       enablePasswordRetrieval="false"
                       enablePasswordReset="false"
                       requiresUniqueEmail="false"
                       requiresQuestionAndAnswer="false"
                       minRequiredPasswordLength="7"
                       minRequiredNonalphanumericCharacters="1"
                       applicationName=".NET Pet Shop 4.0"
                       hashAlgorithmType="SHA1"
                       passwordFormat="Hashed"/>
              </providers>
         </membership>
           -->
         < caching >
              < sqlCacheDependency enabled = "true"pollTime="10000">
                   < databases >
                       < add name = "MSPetShop4"connectionStringName="SQLConnString1"pollTime="10000"/>
                   </ databases >
              </ sqlCacheDependency >
         </ caching >
     </ system.web >
     < location path = "UserProfile.aspx">
         < system.web >
              < authorization >
                   < deny users = "?"/>
              </ authorization >
         </ system.web >
     </ location >
     < location path = "CheckOut.aspx">
         < system.web >
              < authorization >
                   < deny users = "?"/>
              </ authorization >
         </ system.web >
     </ location >
</ configuration >
 
 
 
/SQLServerDAL/Item.cs IItem 的实现类)
using System;
using System.Data;
using System.Data.SqlClient;
using PetShop.Model;
using PetShop.IDAL;
using System.Collections.Generic;
using PetShop.DBUtility;
 
namespace PetShop.SQLServerDAL {
 
    public class Item : IItem {
 
        // Static constants
        private const string SQL_SELECT_ITEMS_BY_PRODUCT = "SELECT Item.ItemId, Item.Name, Inventory.Qty, Item.ListPrice, Product.Name, Item.Image, Product.CategoryId, Product.ProductId FROM Item INNER JOIN Product ON Item.ProductId = Product.ProductId INNER JOIN Inventory ON Item.ItemId = Inventory.ItemId WHERE Item.ProductId = @ProductId";
       
        private const string SQL_SELECT_ITEM = "SELECT Item.ItemId, Item.Name, Item.ListPrice, Product.Name, Item.Image, Product.CategoryId, Product.ProductId FROM Item INNER JOIN Product ON Item.ProductId = Product.ProductId WHERE Item.ItemId = @ItemId";
 
        private const string PARM_PRODUCT_ID = "@ProductId";
        private const string PARM_ITEM_ID = "@ItemId";
 
        ///<summary>
        /// Function to get a list of items within a product group
        ///</summary>
         ///<param name="productId">Product Id</param>      
        ///<returns>A Generic List of ItemInfo</returns>
         public IList<ItemInfo> GetItemsByProduct(string productId) {
 
            IList<ItemInfo> itemsByProduct = new List<ItemInfo>();
 
            SqlParameter parm = new SqlParameter(PARM_PRODUCT_ID, SqlDbType.VarChar, 10);
            parm.Value = productId;
 
            //Execute the query against the database
              using(SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_ITEMS_BY_PRODUCT, parm)) {
                // Scroll through the results
                while (rdr.Read()) {
                    ItemInfo item = new ItemInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetInt32(2), rdr.GetDecimal(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6), rdr.GetString(7));
                    //Add each item to the arraylist
                    itemsByProduct.Add(item);
                }
            }
            return itemsByProduct;
        }
 
 
        ///<summary>
        /// Get an individual item based on a unique key
        ///</summary>
        ///<param name="itemId">unique key</param>
        ///<returns>Details about the Item</returns>
        public ItemInfo GetItem(string itemId) {
 
            //Set up a return value
            ItemInfo item = null;
 
            //Create a parameter
            SqlParameter parm = new SqlParameter(PARM_ITEM_ID, SqlDbType.VarChar, 10);
            //Bind the parameter
            parm.Value = itemId;
 
            //Execute the query 
            using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_ITEM, parm)) {
                if (rdr.Read())
                    item = new ItemInfo(rdr.GetString(0), rdr.GetString(1), 0, rdr.GetDecimal(2), rdr.GetString(3), rdr.GetString(4), rdr.GetString(5), rdr.GetString(6));
                else
                    item = new ItemInfo();
            }
            return item;
        }
 
        ///<summary>
        /// Get the SqlCommand used to retrieve a list of items by product
        ///</summary>
        ///<param name="id">Product id</param>
        ///<returns>Sql Command object used to retrieve the data</returns>
        public static SqlCommand GetCommand(string id) {
 
            //Create a parameter
            SqlParameter parm = new SqlParameter(PARM_PRODUCT_ID, SqlDbType.VarChar, 10);
            parm.Value = id;
 
            // Create and return SqlCommand object
            SqlCommand command = new SqlCommand(SQL_SELECT_ITEMS_BY_PRODUCT);
            command.Parameters.Add(parm);
            return command;
        }
    }
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、Model主要功能: 1、 将每一个“业务实体”抽象成“(瘦数据)类”,可以很好地“划分”各个“对象”,操作更加清晰 2、 用于在应用程序各层之间传递数据,被用做传输数据的“容器” 3、 这就是所谓的“建模”过程! 4、 Model各个类(Model文件夹中的各个文件)划分或者说编制的原则,更趋向于模拟整个系统中的业务实体 二、实现细节: 1、 PetShop中Model的规划与数据库表的关系: (1) AccountInfo类——Account表 (2) AddressInfo类——无直接对应关系(对应Account表中一部分字段) (3) CartItemInfo类——无直接对应关系 (4) CreditCardInfo类——无直接对应关系 (5) ItemInfo类——Item表 (6) LineItemInfo类——无直接对应关系 (7) OrderInfo类——Orders表 (8) ProductInfo类——Product表 2、 为每一个Model中的类都标记了[Serializable],说明这些类可以被传行化,但是不能被继承! 3、 AccountInfo.cs文件:用户在网站注册的信息,及喜好选择情况 4、 使用构造函数可以初始化私有字段;使用属性可以读取私有字段(但使用属性不能设置私有字段的值) 5、 其中包含一个AddressInfo类的私有变量,和一个AddressInfo类的属性 6、 命名空间为PetShop.Model 7、 AddressInfo.cs文件:用户真实的个人姓名、住址和电话号码等信息 8、 与AccountInfo不同的是,AddressInfo类允许使用属性设置私有变量的值 9、 CartItemInfo.cs文件:描述购物车中每一种所选商品的信息的类 10、 该“类”对象的某些信息(如这里的Subtotal属性)可能并不是此类的“自然信息”,而需要经过简单计算而得到!这些简单但必要的信息也要在类的设计中体现出来! 11、 CreditCardInfo.cs文件:表示特定一张信用卡的信息 12、 ItemInfo.cs文件:一个Item指的是category"product"item,如猫"波斯猫"成年男波斯猫(或成年女波斯猫)。这个文件表示一个Item的所有信息 13、 productDesc字段的作用? 14、 LineItemInfo.cs文件:注意与CartItemInfo类的区别!LineItemInfo是用来描述用户最终确认的订单当中的某一种类的产品的信息的类 15、 同样包括了Subtotal属性 16、 OrderInfo.cs文件:用于显示用户某一个订单具体信息的类,在此一个订单当中,可能包括多个商品种类,即包括多个LineItemInfo对象(实际上在OrderInfo类中也确实存在LineItemInfo类型对象的一个数组!) 17、 ProductInfo.cs文件:包括一个特定Product的信息,如波斯猫 三、启发: 1、 来自Directory项目结束后的启发,以后做设计的时候,要将每个实体抽象为一个类,在整个系统中进行操作。 2、 在任意一个类当中,可能不只包括此实体类的自然信息,也可以包括一些对其他地方数据调用有用的属性信息,如根据数量和单价计算出来的总价属性,或者标志此实体的直属上级实体的属性 四、问题: 1、 忽然发现在MSDN上有文章,关于数据实体的:浏览 2、 抽象这些业务实体模型为瘦数据类的原则是什么?什么样的业务实体可以被抽象,或者说进行抽象后更有意义? 3、 ItemInfo类中,productDesc字段的作用? 一、IDAL主要功能: 1、 这完全是“工厂模式”的一部分实现而已 2、 这是一组接口类,其中包括了每个要公开的数据访问方法。为每个数据库产品单独编写的DAL(数据访问层)都要实现这组接口所定义的方法 3、 也就是规定了在DAL中编写的“对用户账号进行操作的类”所必须执行的方法! 4、 IDAL要达到的目的是:实现业务逻辑(BLL)与数据库访问(DAL)的完全分离!!! 5、 IDAL各个类(IDAL文件夹中的各个文件)划分或者说编制的原则,更趋向于“将对数据库的不同操作进行归类”,考虑的主要方面是数据库操作!!!例如,有对用户账号进行的一系列数据库操作,则将这一系列操作统一放置于IAccount接口(将来实现后的Account类)文件当中 二、实现细节: 1、 IAccount.cs文件:为针对不同数据库产品编写的“操作用户账号的类”所必须实现的一系列方法定义契约 2、 IInventory.cs文件:定义“操作库存量的类”所必须实现的一系列方法;或者说将操作库存量的一系列(所有)方法做一个汇总 3、 IItem.cs文件:定义“操作某一Item的类”所必须实现的一系列方法。(Item在Model中定义了,是指具体某一类别的Product,如男猫或女猫) 4、 对于其中的GetItemsByProduct()方法,返回的是一个ArrayList的接口类型(IList)的对象(见问题部分!) 5、 IOrder.cs文件:定义了一组DAL层中“操作用户订单的类”必须执行的方法。其中包括“添加一张新订单”的方法Insert()和根据一个已有的订单号取得此订单详细信息的方法GetOrder(),此方法返回的是一个OrderInfo对象。(Model中的OrderInfo类模型定义了用户的某一张Order中相关的信息,如发货地点,总价,信用卡号码等等) 6、 IProduct.cs文件:定义类一组在DAL层中编写的“对Product进行操作的类” 7、 IProfile.cs文件:定义一组在DAL层编写的“对用户Profile进行操作的类” 三、启发: 1、 这样就可以让在BLL层只针对IDAL层定义的接口进行编程(使用IDAL接口定义的这些方法)就可以了!!!无论在底层使用了什么厂家的数据库产品,有区别的只是针对此数据库产品编写的DAL层(相同的方法,如SignIn()方法,对于不同的数据库产品,可能有不同的实现方式!),而不会影响到上层的BLL层已经编写好的内容! 2、 从这里可以看到软件架构师和程序员工作上的区别!架构师要负责的是搭建系统的层次结构,定义接口;而程序员要负责的是针对接口的具体代码实现过程! 3、 这个IDAL接口的使用,主要是为了保证在底层数据库实现,甚至数据库产品发生变化的时候,不需要对上层BLL层的业务逻辑进行大量的修改!BLL层针对IDAL接口编程即可!!! 4、 IDAL文件夹中定义的所有的接口中的所有的方法,包括了整个程序要对数据库进行操作的所有方法 5、 由于PetShop只是一个演示程序,所以若对数据库操作的某一类别(如对Account进行操作)中定义的“操作类”不够用(如除了接口中定义的几个方法外还需要其他Account操作),还可以在接口中追加其他的方法,用以约束DAL层的实现类(如Account类)必须执行这些新增加的方法! 四、问题: 1、 定义这组接口后,如何保证为每个单独的数据库产品编写的DAL都执行这组接口所定义的方法?(答案:编写DAL的时候必须刻意保证,否则就失去了定义IDAL层分割BLL和DAL层的意义!!!) 2、 既然在实现GetItemsByProduct()方法的时候,也是要把返回的所有Item对象添加到一个ArrayList当中去,但为什么GetItemsByProduct()方法返回的不是一个ArrayList对象,而是一个IList接口的对象呢?仅仅是基类引用的方法吗?这里的基类引用有什么用呢?是否是由于为了不限制使用的数组形式?执行IList则可以使用ArrayList,也可以使用其他形式的数组??? 3、 IProduct.cs文件中为何要将查询条件参数定义为一个string类型的数组?
关键是系统架构和代码学习两方面,对初学和提高有很大帮助 petshop5.0比较大,代码已经解压出来 4.0和3.0没有解压出来,自行安装解压(需要SqlServer数据做连接或者在安装到数据库连接时直接拷贝出来) petshop5.0 基于.NET Framework 3.5 ------------ 使用LINQ to SQL改进数据访问层 PetShop.Model.DataContext.MSPetShop4DataContext 继承System.Data.Linq.DataContext PetShop.Model.ProductInfo与PetShop.Model.CategoryInfo实体类分别映射数据库表 PetShop.Model.ProductInfo其中的Category属性存在一对一的关系 PetShop.Model.CategoryInfo中的Products属性存在一对多的关系 使用WCF来提供RSS, web/FeedService.svc目录下 PetShop.SyndicationFeeds 并在UI层上做一些改进,如使用ASP.NET AJAX,ListView控件等。 在PetShop 5.0中引入了异步处理机制。 插入订单的策略可以分为同步和异步,两者的插入策略明显不同,但对于调用者而言,插入订单的接口是完全一样的,所以PetShop 5.0中设计了IBLLStrategy模块。 虽然在IBLLStrategy模块中,仅仅是简单的IOrderStategy,但同时也给出了一个范例和信息,那就是在业务逻辑的处理中,如果存在业务操作的多样化,或者是今后可能的变化,均应利用抽象的原理。或者使用接口,或者使用抽象类,从而脱离对具体业务的依赖。 不过在PetShop中,由于业务逻辑相对简单,这种思想体现得不够明显。 也正因为此,PetShop将核心的业务逻辑都放到了一个模块BLL中,并没有将具体的实现和抽象严格的按照模块分开。所以表示层和业务逻辑层之间的调用关系,其耦合度相对较高: PetShop4.0源代码 .NET Pet Shop4 应用程序的设计说明了构建企业 n 层 .NET 2.0 应用程序的最佳做法,这种应用程序可能需要支持各种数据库平台和部署方案。 .NET Pet Shop 4 项目的目标是: 工作效率:减少了 .NET Pet Shop 3 的代码数量 - 我们减少了近 25% 的代码。 利用 ASP.NET 2.0 的新功能 - 我们利用母版页、成员身份和配置文件,并设计出一个新的、吸引人的用户界面。 企业体系结构:构建一个灵活的最佳做法应用程序 - 我们实现了设计模式,以及表示层、业务层和数据层的分离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值