• Property Bags Object Model中的小“陷阱”


    今天在调试一个SharePoint程序的时候,发现一个Bug。SharePoint 2007中对SPWeb、SPFolder、SPListItem都提供了一个方便的Property Bags特性,用来存放一些自定义的属性信息,就像这样:

    SPListItem item = ...;
    item.Properties["MyProp1"] = "PropValue1";
    item.Properties["MyProp2"] = "PropValue2";
    item.Update();


    我发现的Bug是,有一些存放在SPWeb.Properties中的自定义属性,没有正确的保存到Content Database中。仔细检查了一下,发现了原因所在。这个小问题确实容易成为一个代码中的“陷阱”,所以提醒一下大家。

    SPFolder、SPListItem的Property Bags(即SPFolder.Properties / SPListItem.Properties)都是直接使用一个Hashtable来实现的,当我们调用SPFolder.Update()或SPListItem.Update()时,就能把它们的Property Bags里面的数据也写回到Content Database。

    但是,SPWeb.Properties是通过一个定制的SPPropertyBag类(继承自System.Collections.Specialized.StringDictionary)来实现的,通过调用SPWeb.Update()并不会将Property Bags中的数据写回到Content Database,而是需要调用SPPropertyBag.Update()方法。示例:

    SPWeb web = SPContext.Current.Web;
    web.Properties["MyProp1"] = "PropValue1";
    web.Properties.Update();


    我不知道为什么它们有这样的设计区别,但个人猜测最大的可能,是SPFolder/SPListItem和SPWeb的实现不是一个Developer写的,写SPFolder/SPListItem的Developer想了一下,觉得使用一个简单的Hashtable就足够了,而写SPWeb的Developer则觉得应该专门定义一个SPPropertyBag类,这样整个项目中不同的需要使用Property Bags特性的类都可以重用这个SPPropertyBag。可惜,就像那句老话说的:“开发人员精心设计用来重用的东东,90%的可能都不会有被重用的可能”... :)

  • 相关阅读:
    http://blog.csdn.net/zhang_xinxiu/article/details/38655311
    三分钟了解Activity工作流
    在eclipse中设计BPMN 2.0工作流定义的根本步骤
    http://blog.csdn.net/bluejoe2000/article/details/39521405#t9
    activity的测试工程activiti-explorer使用
    如何让Activiti-Explorer使用sql server数据库
    Java中对List集合排序的两种方法
    常用 Git 命令清单
    推荐!手把手教你使用Git
    理解RESTful架构
  • 原文地址:https://www.cnblogs.com/kaneboy/p/2436952.html
Copyright © 2020-2023  润新知