具体实施方式
这里讨论了控制对软件构件持久性设置的访问。这些设置跨软件构件的不同执行而存留。软件产品由一个或多个软件构件组成,每个软件构件可以与设置存储控制模块通信。所述设置存储控制模块控制对与软件构件相关联的至少某些持久性状态的访问。软件构件可以存储由设置存储控制模块控制对其的访问的一种类型的持久性设置(被称为公共设置(public settings))。软件构件也可以存储其它类型的持久性设置或信息(被称为私有状态(private state))。在公共设置和私有状态两者的情形下,存储软件构件的持久性状态数据的位置被控制。在公共设置的情形下,数据的结构和类型由存储控制模块按照通过软件构件的已声明设置模式(setting schema)强加的每个约束条件来进行约束。在私有状态的情形下,软件构件本身确定数据的结构和类型,但不确定实际上存储该数据的位置。
可以被特定的软件构件访问的特定的公共设置在设置模式中声明,该设置模式是作为软件构件的不可改变的库存清单(manifest)的一部分的。设置存储控制模块将每个软件构件约束为仅仅访问在设置模式中已声明的软件构件的公共设置;对于来自软件构件的访问公共设置的其它请求被设置存储控制模块拒绝。
另外,设置存储控制模块可以保留和允许访问用于每个设置的多个不同的值。当设置值被写入时,存储该设置值的位置可以是取决于该值的写入者的身份的。因此,不同的构件、模块、设备等等可以让不同的设置值同时对于同一个设置被存储和存留。算法或规则组可被使用来识别那些不同的设置值中的哪个设置值将响应于对于特定设置的值的请求而被返回。
图1图解按照一个或多个实施例的、实现对软件构件状态的控制访问的示例性计算设备100。计算设备100可以是能够运行应用的各种各样不同的设备。例如,计算设备100可以是台式计算机、服务器计算机、膝上型计算机、移动站、娱乐器具、可通信地耦合到显示设备的机顶盒、蜂窝电话或其它无线电话、游戏操纵台、汽车计算机等等。因此,计算设备100的范围可以是从具有大量存储器和处理器资源的完全资源设备(例如,个人计算机、游戏控制台)到具有有限的存储器和/或处理资源的低资源设备(例如,传统的机顶盒、手持游戏操纵台)。
计算设备100包括软件构件设置存储控制模块102和软件构件状态存储库(store)104。两个软件产品106和108--也被称为软件应用--被图解为是包括在计算设备100中的。虽然在图1的例子中图示了两个软件产品106和108,但可替换地,在计算设备100中可以包括少于两个或多于两个软件产品。每个软件产品106和108包括一个或多个软件构件。在图1的例子中,软件产品106包括软件构件112、软件构件114和软件构件116,而软件产品108包括软件构件116和软件构件118。正如在图1上可以看到的,多个不同的软件产品可以共享软件构件(例如,软件构件116)。
构件软件设置存储控制模块102管理至少某些在软件构件状态存储库104中的用于软件构件112-118的设置的存储及对所述设置的访问。这些设置是由控制模块102跨软件构件112-118的不同执行而存留的、用于软件构件112-118的配置信息。可以由控制模块102为每个软件构件112-118管理多个不同的设置。这些不同设置的每个设置具有设置标识和一个或多个设置值,正如在下面更详细地讨论的。被软件构件112-118存储的特定设置和软件构件112-118如何使用这些设置,由一个个软件构件112-118的开发者确定。然而,所述设置的一个或多个值的存储由控制模块102控制和管理。
正如在图1上可以看到的,每个软件产品包括一个或多个软件构件。软件产品的软件构件包括可在计算设备100上运行的指令和数据,以及所述软件构件一起提供软件产品的功能性。对控制模块102的访问是由软件构件在运行时作出的,而不是由软件产品作为整体作出的。
图2图解按照一个或多个实施例的示例性软件构件200。软件构件是一个或多个文件与描述软件构件的元数据的集合。软件构件200包括一个或多个资源文件202,每个资源文件存储着用于软件构件200的各种指令和/或数据。被包括在软件构件200 中的特定的资源文件202可以根据软件构件200的开发者的希望而变化。
库存清单204存储描述软件构件200的元数据。在一个或多个实施例中,库存清单204包括软件构件200的标识符、软件构件200的一个或多个版本号、以及用于软件构件200的一个或多个公共设置声明(总起来被称为“设置模式”)。软件构件200的标识符允许软件构件200与被安装在设备上的其它软件构件区分开。标识符可以以各种各样的不同的方式被生成,诸如根据由软件构件200的开发者赋予的名称、软件构件200的开发者的标识符、软件构件200的出版者或发行者的标识符、软件构件200的版本号等等。
软件构件200的版本号使得软件构件200的不同版本容易被识别。在一个或多个实施例中,两个不同的版本号被包括在库存清单204中:合同版本号和服务版本号。可替换地,合同版本号和服务版本号可以一起组合成多元素号,令一个或多个元素是合同版本号而一个或多个元素是服务版本号。这些版本号可被使用来便于软件构件200的升级,而同时在某些情形下保留以前的状态设置,正如在下面更详细地讨论的。
在库存清单204中声明的公共设置模式规定由软件构件利用的(leverage)一个或多个公共设置的每个设置的名称、数据类型和缺省值。在该模式中的每个公共设置声明被存储控制管理器利用,以确保软件构件对那个特定设置的运行时访问是以正确的格式(正确的格式的验证是图1的存储控制模块102的责任之一)。与每个所声明的公共设置相关联的值(例如,在下面更详细地讨论的缺省值、由软件构件写入的软件值和策略覆盖(policy override)值)跨软件构件200的不同执行而存留。例如,软件构件200的执行可以被终结和随后重新启动,以及当重新启动时,对于软件构件200的设置的所存储的值可被检索,从而使得软件构件200具有带着和执行被终结之前的相同的设置值的相同设置。
用几种操作系统定义的低级别数据类型之一,诸如整数、串、布尔(Boolean)等等,来声明在设置模式中声明的特定的设置。可以在设置模式中声明多个设置,以便将更复杂的数据类型表示为这组基本(primitive)数据类型的复合体。例如,公共设置可被声明来代表诸如屏幕位置(例如,识别用户接口的一些部分要被显示在哪里)、字型大小和/或字体、语言优选项、缺省的位置、卷级别优选项、启用或禁用特定的输入设备等等那样的信息。
应当指出,其值被软件构件200存储的设置是指软件状态,而不是用户数据。软件状态是指具有被操作系统(或可替换地,被另一个应用程序)管理的位置和寿命的数据,尽管软件状态的值可以响应于用户请求而被改变。另一方面,用户数据是指具有明显地被用户管理的位置和寿命的数据文件(例如,特定的文档文件、图片文件、音乐文件等等)。
软件构件200可以存储公共设置和/或私有状态。私有状态是指未模式化(unschematized)的信息,其结构和数据类型由软件构件的实现方案确定(即,私有状态未在设置声明中被模式化)。私有状态和它的存储在下面更详细地讨论。
另一方面,公共设置是指由软件构件设置存储控制模块(诸如图1的模块102)管理的状态。库存清单204包括对于每个公共设置的设置声明、识别设置身份、为该设置存储的信息的类型和可选地用于该设置的缺省值。
在一个或多个实施例中,在库存清单204中的公共设置声明包括三个元素:名称、类型和缺省值。名称规定标识该公共设置的名字(moniker),区分开该公共设置与由软件构件200使用的其它公共设置。类型标识了用于公共设置的数据类型(例如,被使用来存储特定的值的尺寸、格式和语义)。可以支持各种各样不同的设置类型,诸如整数、布尔值、字符串、日期和/或时间值、对文件或目录的引用等等。缺省值标识了如由软件构件200的开发者规定的用于公共设置的缺省值。这个缺省值被保留,尽管该设置的值此后可能被改变,正如在下面更详细地讨论的。在一个或多个实施例中,每个设置具有缺省值,虽然可以使用空串、“空(null)”或零的值等缺省值。在其它实施例中,开发者可能没有提供缺省值。
回到图1,每个软件构件112-118可以保留私有状态和/或公共设置。每个软件构件112-118可以存储它想要的任何数据或信息,并且不被约束为向控制模块102预先声明它的私有状态。然而,私有状态数据的位置被操作系统控制。存储控制模块102,或可替换地,计算设备100的操作系统的另一个构件或模块,给每个软件构件提供在文件系统分级结构中或在其它登记存储库中的一个或多个位置,在其中它可以存储它的私有状态。
另一方面,公共设置是指由存储控制模块102管理的设置。每个软件构件112-118预先声明它希望让模块102作为公共设置而保留的特定的设置。这个预先声明例如是通过使用如以上讨论的库存清单的公共设置声明而完成的。公共设置声明在运行的软件构件试图访问公共设置之前被向模块102预先声明。
公共设置的预先声明向控制模块102提供用于那些设置的适当格式的确切规范。通过预先声明它的公共设置,软件构件被约束为仅仅访问被预先声明的公共设置。例如,状态被控制模块102约束为具有如预先声明的名称、具有如预先声明的设置类型和具有如预先声明的缺省值。
图3图解按照一个或多个实施例、实现对软件构件设置值的控制访问的示例性计算设备300。计算设备300可以是例如图1的计算设备100。为了易于说明,在图3上图解了具有单个软件构件304的软件产品302。然而,应当意识到,多个软件构件可被包括在如上讨论的软件产品中。
软件构件304可以把公共设置值和/或私有状态存储在软件构件状态存储库306。软件构件状态存储库306可以是例如图1的存储库104。存储库306的私有状态部分308把任凭软件构件开发者自行处理的任意的信息存储在由计算设备300的操作系统确定的位置,而存储库306的公共设置部分310存储公共设置值。软件构件304可以直接访问私有状态部分308,按所希望地在计算设备300的操作系统所规定的位置中保存、检索和以其它方式访问私有状态。软件构件304可被操作系统告知以这个位置,或可替换地,位置可被操作系统提取,并且软件构件可以经由被操作系统显露的一个或多个应用编程接口(API)方法而访问私有状态部分308。
然而,软件构件304经由软件构件设置存储控制模块312访问公共设置部分310。控制模块312典型地被实现为在计算设备300上运行的操作系统的一部分,虽然控制模块312可以可替换地被实现为单独的模块或构件。因此,来自软件构件304的、对于保存、检索或以其它方式访问公共设置部分310的请求,由模块312而不是直接由软件构件304对存储库306执行。控制模块312可以是例如图1的控制模块102。
由软件构件304使用的公共设置的名称向存储控制模块312标识了该公共设置,并且允许模块312将该公共设置与由软件构件304使用的其它公共设置区分开。模块312利用设置模式以验证所命名的公共设置,正如以上讨论的。由软件构件304使用的公共设置的这个名称可以是如在设置模式中所声明的设置的名称,或可替换地,可以是与如在设置模式中声明的设置的名称相关联的另一个名称和/或更复杂的名字,以便适应用于公共设置的更复杂类型的系统。
私有状态部分308还可选择地包括可丢弃的状态部分314。可丢弃的状态部分314存储被认为是具有低价值并且可以在维持软件构件304正确运行的同时被丢弃的私有状态。在一个或多个实施例中,可丢弃的状态部分314存储可以在从存储库306被删除后容易被重新确定的私有状态。例如,软件构件304可以使用可丢弃的状态部分314作为一种类型的性能高速缓冲器,存储由软件构件304计算或从某其他软件构件得到的信息(例如,很长的计算的中间结果)。软件构件304的性能可以通过以下方式来被改进,即:从可丢弃的状态部分314 检索该信息而不是在每次软件构件304想要使用该信息时都重新计算或重新得到该信息。然而,如果可丢弃的状态部分314要被删除,则该信息仍旧可以重新计算或重新得到,从而维持软件构件304的正确运行。
具有可丢弃的状态部分314可以有利于各种不同的使用情形。例如,可以采用多个不同的复位级别,正如下面更详细地讨论的,其中之一可以是删除在可丢弃的状态部分314中的私有状态。作为另一个例子,当想要重新要求存储空间时,可以删除在可丢弃的状态部分314中的信息,以及可以重新要求可丢弃的状态部分314用于其它用途。
软件构件设置存储控制模块312或计算设备300的操作系统的另一个构件或模块控制了软件构件状态存储库306。这个控制包括存储库306的位置(例如,特定的一个或多个存储设备、特定的文件系统路径等等)以及存储库306被组织的方式(例如,使用文件系统分级结构、表格、列表等等)。
软件构件状态存储库306可以以各种各样不同的方式实现。例如,存储库306可以通过使用文件系统分级结构(例如,如在下面参照图4更详细地讨论的)、使用一个或多个表格、一个或多个数据库、一个或多个列表、其它记录等等而被实现。
在一个或多个实施例中,软件构件状态存储库306以文件系统分级结构被实现,令不同的文件夹被使用于计算设备300的不同用户和不同的软件构件304。文件系统分级结构的一些部分可以与私有状态部分308相关联,而文件系统分级结构的另外的部分可以与公共设置部分310相关联。
图4是图解按照一个或多个实施例的、用于存储软件构件设置的示例性文件系统分级结构的框图。图4图解软件构件状态存储库400,该软件构件状态存储库可以是例如图3的存储库306和图1的存储库104。
如图4所示,存储库400被组织成具有最高的或第一级别404、第二级别406、第三级别408和第四级别410。第一级别404存储用于用户的目录或文件夹。在计算设备上对于不同用户可用的特定软件构件可以变化,并且由不同用户使用的相同软件构件可以具有不同的公共设置和/或私有状态。在图4的例子中,有单个用户(用户A),虽然可替换地最高级别404可包括用于在计算设备上每个另外的用户的另外的目录或文件夹。
第二级别406存储用于软件构件的目录或文件夹。对于不同软件构件的设置被存储在不同的位置。每个软件构件在最高级别404中的文件夹下具有它自己的子目录或子文件夹。在图4的例子中,有两个软件构件,虽然可替换地第二级别406可包括用于另外的软件构件的另外的目录或文件夹,或可替换地包括用于单个软件构件的目录或文件夹。
第三级别408存储用于公共设置和私有状态的目录或文件夹。每个软件构件可以具有公共设置和私有状态,以及单独的目录或文件夹被包括在第三级别408中来存储公共设置和私有状态。公共子目录或子文件夹和私有子目录或子文件夹被包括在第三级别406中的每个软件构件目录或文件夹下。存储用于软件构件的公共设置的一个或多个文件可被包括在用于软件构件的文件夹下的公共子文件夹中。对于每个公共设置可以在公共子文件夹中包括单独的文件,或可替换地,多个公共设置可被包括在公共子文件夹中的某个文件中。
第四级别410存储用于可丢弃的私有状态的目录或文件夹。私有状态可包括可丢弃的状态,正如以上讨论的。用于可丢弃的私有状态的信息作为一个或多个文件被存储在第四级别410中的可丢弃的子文件夹,而用于其它私有状态的信息作为一个或多个文件被存储在第三级别408中的私有子文件夹。
回到图3,软件构件设置存储控制模块312得到一个或多个公共设置声明320。每个公共设置声明320是如上面所讨论的用于软件构件304的预先声明的设置。在一个或多个实施例中,公共设置声明320是当软件构件304被安装在计算设备300时由安装构件或模块提供给控制模块312的。可替换地,控制模块312可以以不同的方式得到公共设置声明320。例如,公共设置声明320可以由控制模块312从远程服务(例如,经由互联网或另一个网络)、从计算设备300的另一个本地存储库(可移除的或固定的计算机存储媒体)、从另一个远程服务或源、从另一个计算设备等等被检索。
一旦得到,控制模块312就强制服从公共设置声明320。在执行期间,控制模块312从软件构件304接收访问公共设置部分310的公共设置的请求。控制模块312检查该访问,以证实它们与公共设置声明320相符。例如,控制模块312证实访问的设置身份和类型与在公共设置声明320中声明的设置身份和类型相符。
控制模块312还显露应用编程接口(API)326,允许软件构件304请求对软件构件304的公共设置的访问。各种不同的访问被许可,诸如写入用于公共设置的软件值、读出公共设置的有效值、枚举公共设置模式、去除以前写入的用于公共设置的软件值以便将设置的有效值还原回用于软件构件304的缺省值等等。
为了请求对于公共设置写入软件值,软件构件304提供该设置的名称和想要的值。通过写入用于公共设置的软件值,软件构件304能够覆盖(override)由开发者设置的、作为该设置的预先声明的一部分的缺省值。
响应于对于公共设置写入软件值的请求,控制模块312证实该请求符合该设置的预先声明的格式。这个证实包括证实被包括在请求中的该设置的名称已经被预先声明,和证实想要的值类型与对于该设置已经被预先声明过的值类型相同。如果该请求符合该设置的预先声明的格式,则通过把对于所提供的名称的所提供的值存储在公共设置部分310而执行该请求。然而,如果该请求不符合该设置的预先声明的格式,则该请求被拒绝。
例如,假设软件构件304请求把特定的值作为对于特定设置的值写入。如果该特定设置的名称不是对于软件构件304已预先声明过的设置的名称,则控制模块312拒绝该请求。如果该特定设置的名称匹配于(相同于)对于软件构件304已预先声明过的设置的名称,但设置类型不同(例如,用于所指定的设置的设置类型被预先声明为布尔值,但试图被写入的值是串值),则控制模块312拒绝该请求。然而,如果该特定设置的名称匹配于(相同于)对于软件构件304已预先声明过的设置的名称,以及设置类型匹配于(相同于)对于那个预先声明的设置名称已预先声明过的设置类型,则控制模块312执行该请求。
响应于对于设置读出值的请求,控制模块312证实该请求符合该设置的预先声明的格式。这个证实包括证实被包括在该请求中的设置的名称已被预先声明。如果该请求符合该设置的预先声明的格式,则该请求通过从公共设置部分310检索对于在该请求中被指定的设置的值而被执行。当为在该请求中被指定的设置来存储多个值时,被检索的多个值的特定值可以按照如下面更详细地讨论的各种算法或规则被确定。然而,如果该请求不符合该设置的预先声明的格式,则该请求被拒绝。
应当意识到,因为控制模块312管理对公共设置部分310的访问,所以控制模块312可以防止软件构件304对于设置写入不正确的值类型以及无意中改写用于另一个设置的值。软件构件304不直接访问公共设置部分310。而是控制模块312响应于来自软件构件304的请求去访问公共设置部分310,以及把值写入到公共设置部分310中的适当的位置。还应当指出,这个经由模块312的控制防止了软件构件304无意中改写对于另一个软件构件的设置的值。例如,对于不同的软件构件的公共设置值是通过定义而被保留在不同的存储库中的(它的示例性实施例是以上参照图4描述的)。因为存储库被单独地维护,所以不同的软件构件不需要担心修改对于它们的被声明的设置的软件值将修改与任何其它构件所关联的软件值。另外,正如以上讨论的,控制模块312可以将对于不同用户的公共设置存储在公共设置部分310的不同部分中。计算设备300的当前用户可以以各种各样不同的方式被确定,诸如与另一个构件或模块通信,以便识别当前登录到计算设备300中的特定的用户,识别当前被指派来使用计算设备300的处理器的特定用户,等等。因此,不同的公共设置被存储用于不同的用户,尽管不同的用户可能使用着相同的软件构件。
另外,运行软件构件304导致典型地被称为正被创建的软件构件304的实例的东西。在一个或多个实施例中,软件构件304的多个不同的实例可以同时为同一个当前的用户运行。例如,可以同时从用户和/或另一个构件或模块接收许多次运行相同的软件构件304的请求。在这样的情形下,这多个不同的实例共享公共设置部分310的相同部分。因此,通过软件构件304的一个实例(经由控制模块312)写入到公共设置部分310的设置值可以由软件构件304的另外的实例(经由控制模块312)随后读出。同样地,这多个不同的实例也共享私有状态部分306的相同部分。
例如,假设软件构件304提供便签簿功能性,允许用户创建和保存文本笔记。软件构件304的不同实例共享相同的公共设置,允许设置改变(诸如想要的语言、字型大小、字体的改变等等)对于软件构件304的多个实例是相同的。
应当指出,正如这里讨论的,控制模块312是在软件构件的基础上管理对公共设置的访问。不是软件产品请求对公共设置的访问,而是组成软件产品的一个个软件构件请求对公共设置的访问。因此,应当意识到,由软件构件在作为一个软件产品的一部分执行时对公共设置作出的改变可以随后由那个软件构件在作为另一个软件产品的一部分执行时检索。
在一个或多个实施例中,软件构件设置存储控制模块312保留对于同一个设置的多个不同的值。这些不同的值可以由不同的实体提供,诸如开发者(他提供缺省值)、软件构件304、计算设备300的管理员、计算设备300被耦合到的网络的管理员等等。这些不同的值被提供来覆盖特定的其它值,诸如覆盖来自开发者的缺省值的管理员覆盖值;覆盖由软件构件304设置的值的管理员覆盖值等等。管理员覆盖值也可以被称为策略覆盖值。这些不同的值可以以不同的方式被保留,诸如保留在公共设置部分310的不同部分。例如,公共文件夹(例如,在图4的级别408)可以具有多个子文件夹,每个子文件夹对应于不同的实体。作为另一个例子,来自软件构件304的值可被保留在公共文件夹中(例如,在图4的级别408中),而来自其它实体的值可被保留在其它文件夹、表格、列表等等中。控制模块312或另一个构件或模块可以在这样的文件夹、表格、列表等上强加访问权利,允许控制模块312访问这样的文件夹、表格、列表等,但阻止软件构件304访问这样的文件夹、表格、列表等。
这些不同的实体可以以各种各样的不同方式提供它们对于设置的各自的值。来自开发者的缺省值可以如以上讨论的被提供在公共设置声明320中。来自软件构件304的值可经由API 326被包括在写入请求中。来自管理员的值可经由API 326被包括在写入请求中,可以经由另一个接口被提供到控制模块312,可以由管理员或另一个构件或模块等等存储在存储库306(或另一个存储库)的已知的位置中(为管理员和控制模块312两者所知)。
在一个或多个实施例中,写入或以其它方式存储值的实体是根据写入或存储出现的方式而固有地给出的。例如,在公共设置声明320中的值是来自开发者的缺省值,经由API 326接收的值是来自软件构件304的值等等。可替换地,写入或以其它方式存储值的实体可以以其它方式被识别。例如,实体可以在作出写入请求之前提供本身的标识符,实体可以提供本身的标识符作为写入请求的一部分,等等。
当软件构件304请求读出用于设置的值时,软件构件304可以标识它正在请求用于该设置的多个值中的哪一个。例如,软件构件304可以标识它正在请求缺省值、由软件构件304设置的值等等。在一个或多个实施例中,软件构件304通过把它正在请求的多个值中的哪个值的标识符包括在请求中而标识它正在请求用于该设置的多个值中的哪个值。可替换地,软件构件304可以以其它方式来标识它正在请求用于该设置的多个值中的哪个值,诸如通过对于不同的值调用API 326的不同方法(例如,一个读出缺省值的方法、另一个读出由软件构件304 以前设置的值的方法等等)。
在一个或多个实施例中,软件构件304可以标识:它请求读出用于设置的“有效值(effective value)”。响应于这样的请求,控制模块312确定对于该设置的有效值(假设读出请求被证实为是符合该设置的预先声明的格式的)并且把有效值返回给软件构件304。有效值是为该设置存储的值之一,特定的一个有效值是按照特定的算法或规则组被确定的。这个算法或规则组描述了多个值中的哪个值具有超过该多个值的其它值的优先权,因此是响应于对于设置值的请求而要被返回的值。
在一个或多个实施例中,控制模块312按照以下的规则确定有效值。如果存在由管理员设置的用于该设置的值,则该值是有效值。否则,如果存在由软件构件304设置的用于该设置的值,则该值是有效值。否则,缺省值是有效值。
在一个或多个其他的实施例中,控制模块312按照以下的规则确定有效值。如果存在管理员覆盖值来覆盖由软件构件304设置的值,则该值是有效值。否则,如果存在由软件构件304设置的用于该设置的值,则那个值是有效值。否则,如果存在管理员覆盖值来覆盖缺省值组,则那个值是有效值。否则,缺省值是有效值。
另外,在一个或多个实施例中,公共设置可以被集合在一起以形成原子(atomic)单元。当多个公共设置被集合在一起时,控制模块312将集合在一起的设置作为一个组写入公共设置部分310。虽然如果希望的话,软件构件304(或它的不同的实例)可以访问读出和/或写入这些被集合在一起的公共设置的一个个公共设置,但模块312保证它们作为一个组被写入到部分310。
例如,四个值可被使用来标识要被显示的矩形的位置(例如,在“x”维的左上值(upper left value)、在“y”维的左上值、在“x”维的右下值(lower right value)和在“y”维的右下值)。这四个值的每个值可以是不同的公共设置,且这四个公共设置可被声明为是集合在一起的。因此,如果控制模块312接收到来自软件构件304的、写入这四个值的一个或多个值的请求,则控制模块312将所有的四个值写入到部分310。控制模块312因此防止出现软件构件的实例写入被存储在公共设置部分310中的四个值之一的情形--在本例中可导致所存储的坐标是无意义的情形。
另外,在一个或多个实施例中,API 326显露一个或多个方法,所述方法允许软件构件304访问它自己的公共设置值。可以显露不同的方法以允许不同类型的访问(例如,读访问、写访问、枚举访问等等)。下面的表I描述了可以被软件构件304调用的这样的方法的例子。
表I
方法 |
说明 |
读设置值 |
允许软件构件读出所规定的设置的值。调用者规定设置名称(例如,路径)和想要的值类型(例如,缺省值、有效值等等)作为参数。 |
写设置值 |
允许软件构件写入所规定的设置的值。调用者规定设置名称(例如,路径)和想要的值类型(例如,缺省值、有效值等等)作为参数。 |
复位设置值 |
允许软件构件去除以前由该构件写入的任何公共设置值。调用者规定要为其去除设置值的设置名称(例如,路径)作为参数。 |
枚举设置值 |
允许软件构件枚举对于特定的设置名称(例如,路径)的设置。调用者规定设置名称(例如,路径)或空串来作为参数以指示软件构件的所有的公共设置。关于所规定的设置名称的每个设置(或对于该软件构件的所有的公共设置)的信息被返回。 |
得到状态目录 |
返回私有状态部分的位置(例如,文件夹路径名称)。调用者规定状态目录的类型(例如,可丢弃的或不可丢弃的)。如果在软件构件状态存储库中还没有文件夹存在,则在该位置被返回给调用者之前创建文件夹。 |
复位状态 |
复位该设置和任选地复位对于规定的软件构件的其它状态。调用者可以规定复位哪些设置或其他状态(比如,仅可丢弃的状态、所有状态等等),正如下文中更详细地讨论的。 |
图5是图解按照一个或多个实施例的、用于设备控制对软件构件设置值的访问的示例性过程500的流程图。过程500由诸如图1的计算设备100或图3的计算设备300那样的设备实行,以及它可以以软件、固件、硬件、或它们的组合实现。过程500是用于控制对软件构件设置的访问的示例性过程;在这里,参照不同的附图,包括了控制对软件构件设置的访问的附加讨论。
在过程500中,对于软件构件的一个或多个设置声明被接收(动作502)。每个设置声明指示对于访问所声明的设置的适当格式。所述设置声明可以以如上所讨论的各种各样的不同方式被接收。
设置声明的不可改变的记录被保留(动作504)。保留这个记录允许例如随后证实对所声明的设置的访问符合适当的格式。这个保留例如可以是存储在动作502接收的库存清单和/或存储包括从在动作502接收的库存清单得到的缺省值的设置。对软件构件实现的执行不能修改设置模式,因为这个信息是软件构件的已公布库存清单合同的不可改变的部分。
对于已声明设置的一个或多个中的每个已声明的设置,多个值被接收(动作506)。这多个值可包括来自各种各样不同的实体的值等等,正如以上讨论的。
接收的多个值的每个值被同时保留(动作508)。因为多个值的每个值被存储,所以可以响应于如以上讨论的不同的请求,而返回该多个值中的不同值。
图6是图解按照一个或多个实施例的、用于设备控制对软件构件设置的访问的示例性过程600的流程图。过程600由诸如图1的计算设备100或图3的计算设备300 那样的设备实行,以及可以以软件、固件、硬件、或它们的组合来实现。过程600是用于控制对软件构件设置的访问的示例性过程;在这里,参照不同的附图,包括了控制对软件构件设置的访问的附加讨论。
在过程600中,从软件构件接收对于访问设置的值的请求(动作602)。这个请求例如可以经由如以上讨论的被软件构件设置存储控制模块显露的API接收。
将所述请求与用于该设置的已声明的格式进行比较(动作604),且进行有关所述请求是否符合用于该设置的适当格式的检查(动作606)。这个检查可包括各种操作,诸如检查如以上讨论的设置名称、设置类型、原子性是否被维持等等。
如果所述请求符合用于该设置的适当的格式,则所请求的访问被执行(动作608)。然而,如果所述请求不符合用于该设置的适当的格式,则所请求的访问被拒绝(动作610)且因此不被执行。
这里讨论的控制对软件构件状态的访问的技术提供了对于软件构件的公共设置的控制,帮助防止设置值的无意中的改写,以及提供了供开发者利用的更一致的设置模型。另外,这里讨论的控制对软件构件状态的访问的技术为各种使用情形作好准备。
在一个或多个实施例中,控制对软件构件状态的访问允许用于软件构件的多个复位级别。可以利用不同的复位级别,每个复位级别改变对于软件构件的私有状态和/或公共设置。例如,一个复位级别可以删除在私有状态部分的可丢弃的状态部分中的所有状态,但维持私有状态部分的其余部分和公共设置部分不变。在这样的复位后,被保留在私有状态部分(除了可丢弃的状态部分以外)和公共设置部分中的软件构件的值对于软件构件仍旧是可访问的。作为另一个例子,另一个复位级别可以删除在私有状态部分中的所有状态(而不管该信息是否是在可丢弃的状态部分中),但维持公共设置部分不变。在这样的复位后,被保留在公共设置部分中的软件构件的设置对于软件构件仍旧是可访问的。作为再一个例子,再一个复位级别可以删除由软件构件设置的所有的值,实际上使得软件构件的设置返回到它们的缺省级别(在公共设置声明中提供的缺省值)。在这样的复位后,软件构件的缺省值对于软件构件仍旧是可访问的。
另外,控制对软件构件状态的访问允许软件构件被升级到新的版本,而同时保留以前的私有状态和公共设置值。正如以上讨论的,版本号可包括合同版本号和服务版本号。在一个或多个实施例中,即使服务版本号不同,软件构件设置存储控制模块也将具有相同合同版本号的软件构件识别为相同的软件构件。然而,软件构件设置存储控制模块将具有不同的合同版本号的软件构件识别为不同的软件构件。因此,开发者可以发布具有相同的合同版本号、但具有新的服务版本号的软件构件的新版本,并且仍旧让软件构件访问由软件构件的以前的版本存储的私有状态和公共设置值。
而且,在一个或多个实施例中,控制对软件构件状态的访问便于软件构件的迁移。这种迁移可以是指软件构件从一个计算设备转移到另一个计算设备,或改变其上安装了该软件构件的计算设备所使用的操作系统。不管迁移的类型如何,对于软件构件的公共设置和私有状态值都被保留在软件构件设置存储库的特定部分中。这些特定部分是已知的,且在迁移期间可以利用这种知识,以允许公共设置和私有状态值连同软件构件一起被迁移(到不同的计算设备和/或不同的操作系统)。
图7图解按照一个或多个实施例的、可被配置成实现对软件构件状态的控制访问的示例性计算设备700。计算设备700可以是例如图1的计算设备100或图3的计算设备300。
计算设备700包括一个或多个处理器或处理单元702、一个或多个可以包括一个或多个存储器和/或存储部件706的计算机可读媒体704,一个或多个输入/输出(I/O)设备708和允许各种部件和设备互相通信的总线710。计算机可读媒体704和/或一个或多个I/O设备708可以被包括作为计算设备700的一部分,或可替换地,可被耦合到计算设备700。总线710代表几种类型的总线结构的一种或多种,包括使用各种各样不同的总线结构的存储器总线或存储器控制器、外设总线、加速的图形端口、处理器或本地总线等等。总线710可包括有线和/或无线总线。
存储器/存储部件706代表一个或多个计算机存储媒体。部件706可包括易失性媒体(诸如随机存取存储器(RAM))和/或非易失性媒体(诸如只读存储器(ROM)、闪存、光盘、磁盘等等)。部件706可包括固定的媒体(例如,RAM、ROM、固定的硬驱动等等)以及可移除的媒体(例如,闪存驱动、可移除的硬驱动和光盘等等)。
这里讨论的技术可以以具有由一个或多个处理单元702执行的指令的软件被实现。应当意识到,不同的指令可被存储在计算设备700的不同部件中,诸如处理单元702中、处理单元702的各种高速缓冲存储器中、设备700的其它高速缓冲存储器中(未示出)、其它的计算机可读媒体中等等。另外,应当意识到,在计算设备700中存储指令的位置可以随时间而改变。
一个或多个输入/输出设备708允许用户将命令和信息输入到计算设备700,还允许将信息呈现给用户和/或其它部件或设备。输入设备的例子包括键盘、光标控制装置(例如鼠标)、话筒、扫描仪等等。输出设备的例子包括显示设备(例如,显示器或投影仪)、扬声器、打印机、网卡等等。
各种技术在这里可以在软件或程序模块的一般性上下文中描述。通常,软件包括执行特定任务或实现特定的抽象数据类型的例行程序、程序、对象、构件、数据结构等等。这些模块和技术的实现可被存储在某种形式的计算机可读媒体中,或跨某种形式的计算机可读媒体被发送。计算机可读媒体可以是计算设备可访问的任何可用的介质或媒体。作为例子,但不作为限制,计算机可读媒体可包括“计算机存储媒体”和“通信媒体”。
“计算机存储媒体”包括以用于存储诸如计算机可读指令、数据结构、程序模块、或其它数据那样的信息的任何方法或技术实现的易失性和非易失性、可移除和不可移除的媒体。计算机存储媒体包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)、或其它光存储装置、盒式磁带、磁带、磁盘存储装置或其它磁存储设备、或可被使用来存储想要的信息且可以由计算机访问的任何其它介质。
“通信媒体”典型地将计算机可读指令、数据结构、程序模块、或其它数据具体化为诸如载波或其它输送机制那样的调制的数据信号。通信媒体还包括任何信息传递媒体。术语“调制的数据信号”是指使它的特性中的一个或多个以如下方式设置或改变的信号,即:将信息编码在信号中。作为例子,但不作为限制,通信媒体包括诸如有线网络或直接连线连接那样的有线媒体和诸如声学、RF、红外和其它无线媒体那样的无线媒体。以上的任何媒体的组合也被包括在计算机可读媒体的范围内。
通常,这里描述的任何的功能或技术可以通过使用软件、固件、硬件(例如,固定的逻辑电路)、人工处理、或这些实现的组合而被实现。当在这里使用时,术语“模块”和“构件”通常代表软件,虽然可替换地它们也可以合并固件和/或硬件。在软件实现的情形下,模块或构件代表在处理器(例如,一个或多个CPU)上被执行时完成特定任务的程序代码。程序代码可被存储在一个或多个计算机可读存储器设备中,关于它的进一步说明可以参照图7而找到。这里描述的控制对软件构件状态访问的技术的特征是平台独立的,意味着所述技术可以在具有各种各样的处理器的各种各样的商业计算平台上被实现。
虽然本主题是以特定于结构特征和/或方法动作的语言被描述的,但应当理解在所附权利要求中限定的主题不一定局限于上述的特定特征或动作。而是,上述的特定特征或动作是作为实施权利要求的示例性形式而公开的。