RSS 2.0 Feed
开发点滴
摘要: (ZT) http://dotnet.e800.com.cn/articles/2007/11/1167639695398732513_1.html 说起软件系统的层次结构,众说纷纭。不过,许多人都认为传统的C/S结构是两层结构——数据库服务器是一层,客户端应用程序是一层。从这一点来说,B/S结构可认为是三层结构——数据库服务器层、WEB应用服务器层和客户端浏览器一层。 但由于B/S结构的应用,开发者主要精力都集中在WEB应用服务器层,因此对这一层又进行了划分。在Duwamish 7.0中,提供了SystemFramework、Common、DataAccess、BusinessRules、BusinessFacade和web六个项目,每个项目都可认为是一层。但现在更流行的划分是三层数据访问层(Data Access Layer)、商务逻辑层(Business Logic Layer)和表现层(Representation Layer)。数据访问层直接访问和操作数据库,商务逻辑层调用数据访问层,表现层调用商务逻辑层。 表现层有的也叫用户接口层(User Interface Layer),意思是与用户直接进行交互的。在B/S开发中,表现层也有人叫做web层的。 在。Net PetShop 4.0中,有二十个左右的项目。这些项目有些直接是以层次的名称命名的,例如BLL;有些是以层次的名称作为后缀来命名的,如SQLProfileDAL、SQLServerDAL、OracleProfileDAL和OracleDAL等;有些项目包含了一些接口,以I为前缀;有些项目使用工厂模式,以Factory为后缀。不过总体上,还可以将其划分为三层结构。 比较Duwamish7.0与PetShop 4.0,后者项目众多,但使用工具生成的代码很少。而Duwamish7.0中的Common和DataAccess中的文件主要都是使用代码生成器产生的。当数据库的表结构更改后,使用代码生成器产生的代码通常要重新产生,因次如果对这两个项目中的代码做了手工的改动,在重新生成代码时,改动的代码将会丢失。而且Duwamish7.0对数据库的支持不容易扩充,如果想把数据库移到Oracle中,要改很多的代码。但在PetShop 4.0中,只是更改配置文件web.config.    ...[阅读全文]

posted @ | Feedback (0) |

摘要: ZT : http://www.moon-soft.com/doc/51773.htm 对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式 概述 Ado.NET为我们提供了强大的数据库开发能力,它内置的多个对象为我们的数据库编程提供了不同的选择。但是在允许我们灵活选用的同时,许多初学者也很迷惑,我到底是应该使用DataReader还是应该使用DataAdapter?我只想读取一小部分数据,难道我一定要Fill满整个DataSet吗?为什么DataReader不能和RecordSet一样提供一个数据更新的方法?DataSet到底有什么好处? 在本文中,我将对.NET PetShop的数据库编程模式和Duwamish的数据库编程模式进行一些简单的分析和对比。如果您也有以上疑问的话,相信在读完本文之后,就可以根据具体的需要来制定一个最适合您应用的数据库编程模式。 目录 .NET PetShop和Duwamish简单介绍 结构简述 Duwamish数据访问剖析 .NET PetShop数据访问剖析 分析总结 .NET PetShop和Duwamish简单介绍 相信大家一定听说过有名的"宠物店大战",没错,本文的主角之一就是获胜方.NET PetShop,微软号称以27倍的速度和1/4的代码量遥遥领先于基于J2EE的PetStore宠物商店。虽然SUN也曾对此抱怨过不满,指责此"大战"有水分,不过无论如何,.NET PetShop绝对是一个经典的.NET实例教程,至少为我们提供了一条赶超J2EE的“捷径” :),它的下载地址是:http://www.gotdotnet.com/team/compare .NET PetShop宠物网上商店首页 而Duwamish则是一个外表简单,内部却极其复杂的一个网上书店的.NET完整应用范例,作为一个微软官方的Sample,它同时提供了C#和VB.NET两种语言版本,并且还附上了大量详尽的中文资料,如果打印出来,实在是居家旅行,临睡入厕必备之物。什么?您没听说过?呵呵,如果您装了Visual Studio .NET的话,它就在您的硬盘上静静的躺着呢,不过还没有被安装,您可以在您的VS.NET 的Enterprise Samples目录下找到并安装它,例如:C:\Program Files\Microsoft Visual Studio .NET\Enterprise Samples\Duwamish 7.0 CS。 Duwamish网上电子书店首页 结构简述 两家商店都采用了n层应用结构(毫无疑问,n层结构的应用架构应该绝对是您开发.NET应用的首选,哪怕您只想做一个网页计数器),不同的是,PetShop采用的是最常见的三层应用结构,分别为表示层,中间层和数据层。而Duwamish则采用的是一个四层应用结构,并使用不同的项目分隔开,分别为表示层,业务外观层,业务规则层和数据层。至于这两种结构分别有什么优点和缺点,以及为什么要这么分层,我们不进行详细讨论,因为本文的重点不在于此。我们主要分析的是他们的数据库编程的模式。 Duwamish数据访问剖析 首先,我们来看看Duwamish书店,它采用的是DataAdapter和DataSet配合的数据存储模式,所不同的是,它对DataSet进行子类化扩展作为数据载体,也就是采用定制的DataSet来进行层间的数据传输,下面是一个定制的DataSet示例: public class BookData : DataSet { public BookData() { // // Create the tables in the dataset // BuildDataTables(); } private void BuildDataTables() { // // Create the Books table ......[阅读全文]

posted @ | Feedback (1) |

摘要:作者Blog:http://blog.csdn.net/wangyihust/   对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用: 1. Profile技术在PetShop程序中用于三处:     1) 购物车ShoppingCart    -下面的例子围绕购物车流程进行     2) 收藏WishList     3)  用户信息AccountInfo   注册新用户 NewUser.aspx :使用的是CreateUserWizard 控件,基于MemberShip机制,在数据库MSPetShop4Services的表aspnet_Users中创建用户   修改用户注册信息 UserProfile.aspx: 基于Profile技术,在数据库MSPetShop4Profile的表Profiles和Account中创建用户信息 2. 异步消息处理技术运用于订单处理 4.1 Web.config配置 Profile可以利用数据库存储关于用户的个性化信息,有点象session对象,但session对象是有生存期的,在生存期后,session对象自动失效了。而profile不同,除非显式移除它。要实现profile功能,必须先在web.config中进行定义。 在web.congfig中,将会定义一些属性/值,分别存贮将要保存的变量和值,比如language属性,定义其值是string类型,如此类推。而<group>标签,则是将一些相同或类似功能的变量值放在一起。 程序中使用方法:Profile.language = ddlLanguage.SelectedItem.Value;   <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> 4.2 购物车程序流程-Profile技术 1.       点击“加入购物车”: http://localhost:2327/Web/ShoppingCart.aspx?addItem=EST-34 2.     ShoppingCart.aspx文件处理:在init方法之前处理       protected void Page_PreInit(object sender, EventArgs e) {         if (!IsPostBack) {             string itemId = Request.QueryString["addItem"];             if (!string.IsNullOrEmpty(itemId)) {                 Profile.ShoppingCart.Add(itemId); //注意ShoppingCart的类型是PetShop.BLL.Cart                 //Save 方法将修改后的配置文件属性值写入到数据源,如ShoppingCart属性已经改变                 Profile.Save();                               //......[阅读全文]

posted @ | Feedback (1) |

摘要:云风吐血整理了下面这个 :) 可能还有极少漏掉的新特性. 不过那一般是用处不大的东西 1. 对编译器限制增加了,比如源程序每行要求至少支持到 4095 字节 变量名函数名什么的要求支持到 63 字节 ( extern 的要求支持到 31) 2. 预处理增强了. 例如, 1.宏支持类似 ... 的东西 #define Macro(...) __VA_ARGS__ 2. 使用宏的时候,参数如果不写. 而宏里用 #,## 这样的东西, 会扩展成空串. (以前会出错的) 3. 支持 // 行注释 4~xx. 还有些我不太关心的扩展 ;) 3. 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool restrict 含义比较复杂, 不太能简单解释清楚. 好在大家应该 都有耳闻是什么东西, 后面几个 _开头的类型关键字早就应该支持了 ;) 因为防止以有的代码出问题, 所以只好 _ 开头了 支持 long long, long double _Complex, float _Complex 这样的类型 :) 4. 支持 <: :> <% %> %: %:%:, 等等奇怪的符号替代, D&E 里好象提过这个 5. 支持了不定长的数组. 数组的长度就可以用变量了 :) 这个是我刚刚从 ......[阅读全文]

posted @ | Feedback (3) |

摘要:转自微软新闻组 ? 要说到session这个东西,很多人可能都不屑一顾。这个东东嘛,n年前就开始做了,有啥好讲的啊。可是,在很多地方我们还是会发现一些问题,比如有的人说,我的session_start激发了,怎么session_end没有啊,我在session_end做了些善后工作,这下没法完成了,怎么办啊?? 最近看了些文章,结合自己的一些经验,想和大家一起讨论一下其中的说法。? 其实,很多这类的问题都是由一个东西引起的,它就是session ID。首先,是不是我一个IE client起来,访问一个页面,只要我不关浏览器,session ID就是一样的呢?很多人会想,应该是一样的吧,我浏览器都没关,web server总归会认为我是同一个client,不会把session ID变来变去的。要验证这个,让我们现在做一个简单的试验。用vs.net创建一个简单的asp.net web app.在web form1上加个button,然后在页面的page prefix上enable trace.接下来浏览这个页面,不停的click button来提交request。感谢asp.net的这个trace功能,我们可以看到session ID其实是在不停的变化的。也就是说,这时候在服务器端,根本就不关心这个client的存在,每次都觉得它是来自一个新的client.? 那这到底是怎么回事呢?OK,让我们在page_load里面加上一句,session["variable1"]="testvalue";然后再做一下测试。Bingo,现在session ID就保持一致了。我想,很多人也许以前就没有注意到这点。这里我们可以得出一个结论:要建立一个持续的session,咱们需要至少使用一下session变量,用行话来说,就是要至少往session dictionary中写入一次。? 不过,值得注意的是,这只是个必要条件,还不是充分条件。? 在提到下一个必要条件前,我们先来弄清一件事,如果我们在程序中间有global.asax,里面有session_onstart, session_onend,上面的实验是不会成功的。原因是一旦定义了session_onstart处理函数后,session的state就总是会被保存了,即使里面是空的,这样的话,session ID就不会改变了。因为session这东西还是消耗资源的,所以在asp.net web app中如果没有必要,你就不要把session_onstart,session_end写在global.asax中。? 上面的实验中,我们也可以看到,如果session ID在变化,我们就跟踪不到session_onend,一旦稳定下来,session_onend就出现了。? 现在,我们再来谈谈另一个条件,还是先从实验做起,我们在刚才例子的基础上(包括session_onstart, session_onend),在page_load的session那行的下面加上一句,session.abandon().再来运行一把,咦,这是你会发现一点奇怪的地方,session_onend不执行了,尽管session_onstart执行过了一遍。(这里我们需要写一些log语句来观察到)而且,如果我们把session.abandon()写在button.onclick事件里面,session_onend就立马执行了。奇怪吧,这里有什么区别呢?? 这样,第二个必要条件就引发了,要让session_onend成功执行,至少要有一个request已经被完整地执行过。上面的第一种情况,在page_load中就中止的话,第一个request都没有执行完毕,session_onend就没法激发了。? 综合这两个必要条件,我们终于可以得出要让session_onend执行的充分条件了:? 1)至少有一个request成功完整地执行? 2)至少存储一些data在session state中。可以通过session变量或者加上session_onstart来实现。? 最后声明一点,session_onend只在InProc模式中支持,也就是说,只在sessiondata在asp.net worker process中时支持。? ps: 打字真是很辛苦,中英文切来切去更是辛苦,不过还是希望大家可以从中受益,俺也不枉费功夫了。最后,有什么问题的话希望大家多多回帖,一起讨论讨论。...[阅读全文]

posted @ | Feedback (13) |

摘要:http://ms.mblogger.cn/chagel/posts/1907.aspx ?Here are listed some of the existing companion tools for .NET development.Although quite comprehensive, this list is not exhaustive. You can submit new tools or report a dead link by dropping me a line. Note: I have to restrict myself to tool products, and avoid components, class libraries, articles, techniques... otherwise the list would be way too long! That does not mean that I won't make exceptions if I decide to cover a particular area (probably I did already? ). Chad Osgood has created an RSS feed for this list. Check it out right now to keep informed when the list......[阅读全文]

posted @ | Feedback (3) |

摘要:http://expert.csdn.net/Expert/topic/2989/2989631.xml?temp=.9350855 我们将介绍Web Services中涉及到的各种数据类型,也就是Web Services方法的输入/输出参数类型。因为Web Services的执行是建立在XML架构之上的,所以它能够支持丰富的数据类型。下表列出了使用SOAP协议时Web Services支持的数据类型: 类型?描述基础类型?也即标准基础类型,包括: String、Int32、Byte、Boolean、Int16、Int64、Single、Double、Decimal、DateTime(类似XML中的timeInstant)、 DateTime(类似XML中的date)、DateTime(类似XML中的time)以及XmlQualifiedName(类似XML中的QName)。枚举类型?枚举类型。例如:. "public enum color { red=1, blue=2 }"基础,枚举数组?上面提到的类型数组。例如:string[] 和 int[]类和结构?带有公用域或属性的类和结构,公用域和属性是串行结构的类和结构体数组?上述类型的数组DataSet?ADO.NET DataSet 类型。DataSets能在类和结构体作为字段来使用。DataSet数组?上述类型的数组XmlNode?XmlNode是XML文档片断的内存表示,就好像一个轻量级的XML文档对象模型。比如说,"" 就可以存储在一个XmlNode类型变量中。我们可以将XmlNodes作为参数传递,以SOAP兼容方式附加到传递给Web Services的XML文档上。返回值也是同样原理。XmlNode也可看成是类或结构中的字段。XmlNode数组?上述类型的数组基础,枚举数组?上面提到的类型数组。例如:string[] 和 int[]类和结构?带有公用域或属性的类和结构,公用域和属性是串行结构的类和结构体数组?上述类型的数组DataSet?ADO.NET DataSet 类型。DataSets能在类和结构体作为字段来使用。DataSet数组?上述类型的数组XmlNode?XmlNode是XML文档片断的内存表示,就好像一个轻量级的XML文档对象模型。比如说,"" 就可以存储在一个XmlNode类型变量中。我们可以将XmlNodes作为参数传递,以SOAP兼容方式附加到传递给Web Services的XML文档上。返回值也是同样原理。XmlNode也可看成是类或结构中的字段。XmlNode数组?上述类型的数组 ? ??? 当通过SOAP或者HTTP GET/POST调用Web Services时,返回值可以是上述提到的任何一种数据类型。参数的数据类型使用SOAP协议时,"通过值"以及"通过引用"这两种输入/输出参数形式都可被支持。如果是"通过引用"的参数类型,就会产生两种方式的数据发送效果:到服务器的以及返回到客户端的。但是,当通过HTTP GET/POST传递输入参数给Web Services时,就只支持有限的数据类型了,而且还必须是"通过值"形式的参数。这些类型如下: 类型?描述 基础类型 (有限的)?支持大多数标准基础类型,包括: Int32、String、Int16、Int64、Boolean、Single、Double、Decimal、DateTime、TimeSpan、UInt16、UInt32、UInt64和Currency。从客户端来看,所有这些类型都转变为string。 枚举类型?比如: "public enum color { red=1, blue=2 }"。 基础类型数组,枚举类型数组?上述类型的数组,比如 string[]和int[] ?类型?描述 基础类型 (有限的)?支持大多数标准基础类型,包括: Int32、String、Int16、Int64、Boolean、Single、Double、Decimal、DateTime、TimeSpan、UInt16、UInt32、UInt64和Currency。从客户端来看,所有这些类型都转变为string。 枚举类型?比如: "public enum color { red=1, blue=2 }"。 基础类型数组,枚举类型数组?上述类型的数组,比如 string[]和int[]...[阅读全文]

posted @ | Feedback (2) |

摘要:http://www.tekinginfo.com/coding/forum/cndevforum0209_0309/subject_31270.htm -优化-??/O1 最小化空间 minimize space /Op[-] 改善浮点数一致性 improve floating-pt consistency /O2 最大化速度 maximize speed /Os??优选代码空间??favor code space /Oa 假设没有别名 assume no aliasing /Ot 优选代码速度 favor code speed /Ob 内联展开(默认 n=0) inline expansion (default n=0) /Ow??假设交叉函数别名??assume cross-function aliasing /Od??禁用优化(默认值)??disable optimizations (default) /Ox??最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs) /Og??启用全局优化??enable global optimization??/Oy[-]??启用框架指针省略??enable frame pointer omission /Oi??启用内建函数??enable intrinsic functions -代码生成-??/G3??为 80386 进行优化??optimize for 80386 /G4??为 80486 进行优化??optimize for 80486 /GR[-]??启用 C++ RTTI??enable C++ RTTI /G5??为 Pentium 进行优化??optimize for Pentium /G6 为 Pentium Pro 进行优化??optimize for Pentium Pro /GX[-]??启用 C++ 异常处理(与 /EHsc 相同)??enable C++ EH (same as /EHsc) /EHs??启用同步 C++ 异常处理??enable synchronous C++ EH /GD 为......[阅读全文]

posted @ | Feedback (1) |