RSS 2.0 Feed
2004-08 Entries
摘要:在asp.net1.1中,RegisterClientScriptBlock, RegisterStartupScript, RegisterArrayDeclaration和RegisterHiddenField的存储用是HybridDictionary(System.Collections.Specialized)来实现的。HybridDictionary的存储机制有点特殊,在数据量小的时候,HybridDictionary用ListDictionary 来实现IDictionary,当集合变大时,HybridDictionary会换成用Hashtable。这主要是为了性能方面的考虑。因为在小数据量的情况下,ListDictionary表现比较好,而大数据量时Hashtable占有优势。 这样就带来一个问题,因为ListDictionary会维护item添加的顺序,而hashtable不会,当你注册的客户端脚本比较少时,脚本会按照你注册的循序来执行,而当注册的脚本数比较多(超过九个),你就不能通过调整脚本注册的顺序来维护客户端脚本执行顺序...[阅读全文]

posted @ | Feedback (2) | Filed Under [ Dot Net ]

摘要:iBATIS的net版本现在是iBATIS.Net-V0.9iBATIS.Net-V0.9betahttp://sourceforge.net/projects/ibatisnet iBATIS和其他的ORMapping的工具相比有点奇怪,可以说是一个sqlmap,所以在Why use iBATIS SQL Maps? 中有一条理由是You already know SQL, why waste time learning something else? iBATIS的cache模式可以灵活的配置<cacheModel name="account-cache" implementation="LRU" > <flushInterval hours="24"/> <flushOnExecute statement="UpdateAccountViaInlineParameters"/> <flushOnExecute statement="UpdateAccountViaParameterMap"/> <property name="CacheSize" value="50"/></cacheModel> (UpdateAccountViaInlineParameters和UpdateAccountViaParameterMap表示两个对数据库的访问动作) sql语句有三种基本形式存储过程<procedure name="InsertAccountViaStoreProcedure" parameterMap="insert-params">   sp_InsertAccount</procedure> 命名的参数<insert name="InsertAccountViaInlineParameters" parameterClass="Account" > insert into Accounts   (Account_ID, Account_FirstName, Account_LastName, Account_Email)  values   (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#  )</insert>  未命名的参数<statement name="InsertOrderViaParameterMap"  parameterMap="insert-params" > insert into Orders    (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType,  Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode )  values   (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)/statement> 参数的映射关系通过parameterMap来定义<parameterMap name="insert-params"> <parameter property="Id" /> <parameter property="FirstName" /> <parameter property="LastName" />    <parameter property="EmailAddress" nullValue="no_email@provided.com"/></parameterMap> 返回的结果通过<resultMap来定义<resultMap name="order-joined-favourite" class="Order"> <result property="Id"     column="Order_ID"/> <result property="Date"     column="Order_Date"/> <result property="CardExpiry"   column="Order_CardExpiry"/> <result property="CardType"    column="Order_CardType"/> <result property="CardNumber"   column="Order_CardNumber"/> <result property="Street"    column="Order_Street"/> <result property="City"     column="Order_City"/> <result property="Province"    column="Order_Province"/> <result property="PostalCode"   column="Order_PostalCode"/> <result property="FavouriteLineItem" resultMapping="LineItem.LineItem" /></resultMap> 不过现在还不清楚返回"Hashtable"是指什么<resultMap name="lite-order-map-result" class="Hashtable"> <result property="Id"         column="Order_ID"/> <result property="Date"       column="Order_Date"/> <result property="CardExpiry" column="Order_CardExpiry"/> <result property="CardType"   column="Order_CardType"/> <result property="CardNumber" column="Order_CardNumber"/> <result property="Street"    ......[阅读全文]

posted @ | Feedback (5) | Filed Under [ Dot Net ]

摘要:基于.Net的Flexwiki确实非常不错,安装配置都很简单,因为是基于文件的,也不需要数据库做支持,而且支持rss订阅。 但在中文支持方面有些问题,最不方便的地方就是新建链接。 Flexwiki在编辑文件的时候用pascal规则来写一个英文词组,Flexwiki就会新建一个链接,而使用中文就没办法这么做了。英文字符加[]符号,也会生成一个链接,但对中文一样没有作用。改现有页面的标题倒是可以新建以中文作名字的链接,不过常常出错误,特别是中英文混排的时候。 还有中文分词的原因。Flexwiki不会把文字中包含的链接标题自动加上链接。 现有wiki的表现能力都有限,编辑复杂的页面很不方便。如果能有.Text这样的编辑能力,那就太好了。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 无聊 ]

摘要:测试一下代码时发现 Panel testPanel1 = new Panel();testPage.Controls.Add(testPanel1); TextBox name = new TextBox();name.ID="name";name.Text = "name";testPanel1.Controls.Add(name);这时候testPanel1的FindControl找不到TextBox 而把testPanel1加入到Page对象中 Page testPage = new Page();Panel testPanel1 = new Panel();testPage.Controls.Add(testPanel1); testPanel1就能通过的FindControl到TextBox了。 看了一下FindControl的源代码 protected virtual Control FindControl(string id, int pathOffset){      string text1;      Control control1;      this.EnsureChildControls();      if (!this.flags[128])      {            control1 = this.NamingContainer;            if (control1 != null)            {                  return control1.FindControl(id, pathOffset);            }            return null;      }      if ((this._namedControls == null) && this.HasControls())      {            this.EnsureNamedControlsTable();      }      if (this._namedControls == null)      {            return null;      }。。。。。。 } 也没发现什么疑点,为什么加入到Page对象后,Panel才能才能FindControl 呢?...[阅读全文]

posted @ | Feedback (7) | Filed Under [ Dot Net ]

摘要:以前对那些关于加班的理论不是很理解。现在觉得应该坚决不允许加班。因为上班的时候,想到没有做完的工作可以加班完成,就不会全心全力的做。如果规定下班时马上报告进度,然后走人,才能让8小时成为真正的8小时。...[阅读全文]

posted @ | Feedback (14) | Filed Under [ 拥抱变化 ]

摘要:http://blog.csdn.net/devercn/archive/2004/08/07/67989.aspx 我想我是没有说明白(这是我的一种恶习) 我们的情况略有不同,我们已经完成基本的开发,接下来有几个新的功能要做,原本8月底上线,但是因为公司政策,8月底不能上线了,要推迟,而且推迟了很长时间。所以不算是在开发阶段停下来,想借助重构提升设计。 我们希望利用这一点多出来的时间,以现有系统为原型,试着完善我们的系统,总结出一些经验,一步一步地作改进,先把草房子改成木梁的,再把木梁架构改成石头的,再加以美化。同时这段时间加强培训和实践,提升每个人的技能。 即使我们这段时间所学到的完全没有应用到现在的系统,对以后的开发也是大有裨益。 我想我们对重构没有误解,也没有怀疑过重构,我们的关注点在于:这么大范围的对系统作改动,以前是没有尝试过的,要找一个安全的,可控的方法,稳健的前进。 另外,作者说俺有经验,真是愧不敢当。...[阅读全文]

posted @ | Feedback (4) | Filed Under [ Dot Net ]

摘要:一开始是考虑过直接解析request,实际上跳过asp.net的服务器控件使用起来更方便,比如用来选择City的dropDownList,可以直接缓存生成的HTML <td>city:</td><td><%= ControlFac.WriteControl(“city“) %></td> 而且能直接控制生成的HTML,自由度就更大。 但是既然asp.net可以提供服务器控件,那么为什么不用一下呢,毕竟服务器控件还可以保存状态吗。 同样的,我们的Controller可以设计成根据不同的action来自动调用不同的来进行处理,但是现在既然asp.net支持时间处理了,为什么不试验一下用事件处理这样的模式代替解析action呢。...[阅读全文]

posted @ | Feedback (2) | Filed Under [ Dot Net ]

摘要:拿到UI页面后,定义出一个metadata 例子:<uemapper identity="test_company"> <config></config> <elements> <element identity="customer.name" name="customer name" controlid="name" controltype="textbox" datatype="string" entityfieldname="name" maxlength="50" required="true" validationrule=""> <property name="" value="" ></property> </element> <element identity="customer.active" name="customer active" controlid="active" controltype="checkbox" datatype="bool" entityfieldname="active" ></element> <element identity="customer.compliance" name="customer compliance" controlid="active" controltype="checkbox" datatype="bool" entityfieldname="active" ></element> <element identity="customer.shippingmethod" name="customer shippingmethod" controlid="shippingmethod" controltype="dropdownlist" datatype="string" datasource="shippingmethod" datatype="string" entityfieldname="shippingmethod" ></element> <element identity="customer.creditlimit" name="customer credit limit" controlid="creditlimit" controltype="textbox" datatype="money" entityfieldname="creditlimit" ></element> <element......[阅读全文]

posted @ | Feedback (1) | Filed Under [ Dot Net ]

摘要:看了一些asp.net项目,逻辑层和表现层间之间的数据绑定有一些几种: 1:直接解析request对象。 2:用xml传递数据集,还有个好处xmlhttp可以直接利用。 3:封装entity组件,可以直接设计时绑定,在codeproject有例子。 4:自己设计Adapter,可以把Entity的属性绑定到控件集合,也可以从根据控件填充Entity。 使用Adapter的功能更强大,可以把client端验证,判断数据是否发生变化等功能方便的集成进去。...[阅读全文]

posted @ | Feedback (17) |

摘要:常常有人把bug的严重级别可以分为以下几类 1:系统crash   2:重要模块计算错误   3:计算错误,而且没有其他途经替代   4:计算错误,但是可以通过其他途经得到正确结果   5:界面错误   把所有的界面错误一致设为最低是不合适的,比如单词拼写错误,界面够不整齐划一等等,虽然很简单,但是出现的很显眼的地方会大大影响用户和高层管理者对产品的印象。这些细节的地方可以显示出你做的是不是足够专业。而你的系统比其他的系统快了百分之多少,应用了什么先进的技术,吞吐量提高了多少很难给管理者留下多少印象。   这不属于投机取巧,表面功夫。软件以用为本,不是每次升级罗列出一大堆新功能就代表你的产品强大,先进。你了解客户真正需要的吗?   在一个java论坛看到我们是否需要更多的新技术?的讨论,我也很喜欢里面提到的《软件创新之路》这本书。它给我的影响要比一大堆技术内幕之类的书要深远得多,里面剖析的程序员的性格更是鞭辟入里。   我们以前做得那么多系统,只有一个总经理会时不时表扬一下——一个电话簿查询的小工具。其他的呢,他说自己根本不会用或者还没有自己手工作来得方便。另外一个例子,网上常会流传某某客户支持中心的笑话,比如把光驱托盘当成茶杯架之类的,用《软件创新之路》里面的话来说,用户面对这些高新技术装备的产品觉得自己受了愚弄,简直像个白痴。  ...[阅读全文]

posted @ | Feedback (5) | Filed Under [ 无聊 ]

摘要:有一个blog胖子不减肥是我很喜欢看的,今天看到一段话,未经授权引用一下。 >> UNIT TEST又叫单元测试,是针对程序最基本结构单元所进行的测试。而TDD的过程是这样的,写一个测试程序,使其可以运行,重构。在写这个测试程序的时候你考虑的不应该是基于什么结构单元,而是要考虑需要完成的什么功能。实现和重构的时候,具体是不是这个单元完成了这个功能依然不是你应该去考虑的,你考虑的还是——是不是完成了这个功能、是不是代码真的清晰和可工作。你考虑的问题永远是围绕着具体的功能进行的,而不是围绕某种结构进行的。你写这个测试程序的时候,这个结构并不存在,并且今后也可能不存在(由于重构,你在别的结构部分实现了这个功能)。   明白这个道理就可以明白TDD实际还是基于需求驱动的,还是一种前瞻性的设计手段。只不过TDD让这个需求更加具体,让其前瞻性也更可以预测,并且在多种方法中给了你进行多种尝试的机会。而当你认为这个测试只是单元测试的时候,无疑你就把程序的结构早早的做了一个固定,其是基于结构的而不是基于需求的,并且由于其基于结构的一面则设计的前瞻性很难得到保证,而就根本性的断绝了你进行多种尝试的可能。设计的前瞻性是指你的设计可以带来可以预测的结果。而软件的结构是动态的,并且随着你必须进行的重构活动这样的结构变更会日常性的存在。如果你的一个测试高度的依靠某种特殊的结构,在这样的经常性重构的环境下,其被经常性修改的几率会大大增加。而由于其结构的不确定性是根本不可能逆转的,所以针对结构进行的测试根本不可能带来结构上的可预测性,而谈不上什么前瞻性了。 <<   这段话对TDD作了清澈的分析,TDD不单纯是以测试来驱动代码的编写。 我们还没有实践TDD,不是每个成员都对TDD很认同,并且了解怎么来做,这包括我。但是有一点需要强调——TDD不单纯是以测试来驱动代码的编写,而是对整个开发流程的驱动。    ...[阅读全文]

posted @ | Feedback (5) | Filed Under [ 拥抱变化 ]

摘要:《最后期限》阿布杜尔。贾米德一章,觉得贾米德的第一个模型有点问题。   100个人的项目,每个月8个人退出,每当有人退出,马上再雇一个人来代替他,但是新人需要两个月的培训才能完全融入团队。项目中有多少个正常工作的人?   书中的结论是两个月后,正常工作的人会稳定在一个低于100人的水平,但是: 如果第一个月8个人时同时离开的,那么曲线应该跃迁到92, 如果8个人是平均分散离开的,那么第一个月末人数就会在稳定在94人左右   这个例子和斐波那契的数列的兔子有些类似,但是兔子一定要等到两个月后才能生小兔子,而人的在团队发挥的能力是线性增长的。...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 拥抱变化 ]

摘要:有时候页面在postback之后,需要保持滚动条的位置,只要在onscroll事件里记录下当前滚动条的位置就行了   var scrollingElement = null; if (window.event && window.event.srcElement ) { scrollingElement = window.event.srcElement; } else if ( e && e.target ) { scrollingElement = e.target; }   if ( scrollingElement != null ) { document.all(scrollingTopControlID).value = scrollingElement.scrollTop; document.all(scrollingLeftControlID).value = scrollingElement.scrollLeft; } scrollingTopControlID和scrollingLeftControlID是两个用来保存滚动条位置的隐藏字段   在Postback之后,再把记录下的值取回来 var top = document.all(scrollingTopControlID).value; var left = document.all(scrollingLeftControlID).value; if(top != "") { document.all(scrollingPanelControlID)..scrollTop = top; } if(left != "") { document.all(scrollingPanelControlID).scrollLeft = left; } scrollingPanelControlID为Panel的ClientID,当然,现成的控件也很多...[阅读全文]

posted @ | Feedback (4) | Filed Under [ Dot Net ]

摘要:用Label控件有个需要注意的地方,那就是在client修改了innerText,postback时这个值不会送回server端,这个值就丢失了。虽然很简单,但是新手常常会在这里犯错误。另外一点,Lable可能会用来存一些附加的信息,比如Label显示公司的名字,实际上还要存公司的ID:ExID=’<%= …%>’,客户端修改这个ExID后,Postback也要保持状态。   为了保持状态,可以在Lable的OnPreRender事件里面注册一个隐藏字段 Page.RegisterHiddenField(hiddenFieldName,string.Empty);   在Client端可以利用Label的onPropertyChange事件来记录Lable的属性变更 if(event.propertyName == "innerText") { add Track(track, event.propertyName, event.srcElement.innerText); } else { add Track(track, event.propertyName, event.srcElement.attributes[event.propertyName].value); } Track为注册的隐藏字段的ID   Postback回server端后就可以在LoadViewState事件里读出修改记录,更新Label的属性了。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ Dot Net ]

摘要:表的结构修改之后,基于该表的view需要重建,否则可能会有些莫名其妙的错误出现,与其再三叮嘱每个人修改表后重建view不如用工具来简化工作。   Sql server有一个存储过程sp_refreshview是用来重建view的,我们可以利用这个存储过程刷新所有的view,先把所有的view找出来,再利用游标刷新该view   declare @ViewName varchar(250)                 declare #views cursor for select name from sysobjects where type=’V’                 open #views fetch next from #views into @viewname while @@fetch_status=0 begin                 print refreshview ': '+ @viewname                 exec sp_refreshview @viewname                   fetch next from #views into @viewname end                 close #views deallocate #views                 print 'mission complete.'...[阅读全文]

posted @ | Feedback (4) | Filed Under [ Dot Net ]

摘要:Umlchina推荐的《探索需求》到现在也没有上市,人们常常会抱怨需求作的如何如何,事实上,探索需求本来就是很困难的事情,需要千方百计才能诱导用户把真正需求表达出来,需求交给程序人员时又存在交流的误差,另一个事实是只有用户真正使用系统后才会对自己想要的有更清楚地认识,况且,商业模式本来就是不断变化的。所以,本质上讲,需求本来就应该是个不断变化的,而我们所要做的就是——拥抱变化。...[阅读全文]

posted @ | Feedback (1) | Filed Under [ 拥抱变化 ]