这几天,因为觉得MOSS2007的Feature操作使用起来很麻烦,所以自定写了个管理MOSS2007Feature的小工具,也对MOSS2007里的Feature的对象模型以及在各个级别内的关系有了了解,现分享一下。
下载小工具:目前只可以在装有moss的机器上运行.
下边就介绍下MOSS2007中Feature对象模型
安装和卸载Feature也就是把一个自定义的Feature安装到moss服务器场中,涉及到的和Feature相关的类包括:
Microsoft.SharePoint.Administration.SPFeatureDefinition
Microsoft.SharePoint.Administration.SPFeatureDefinitionCollection
每个服务器场都有一个SPFeatureDefinitionCollection的对象属性,名称为FeatureDefinitions,该集合包含当前服务器场中所有的Feature定义。
如果需要向服务器场安装一个新的自定义Feature,则可以使用如下代码:
(这个代码等同于installfeature 操作)
SPFarm farm = SPFarm.Local; farm.FeatureDefinitions.Add("MyFeature/feature.xml", Guid.Empty, true); |
其中,第一个参数是相对"C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\FEATURES"下的路径,第二个参数是feature对应solution的guid,如果没有就为空,第三个参数说明是否强制安装。
也就是说,其实向服务器场中安装一个Feature,其实就是在服务器场的SPFeatureDefinitionCollection的对象属性FeatureDefinitions中添加一个新的SPFeatureDefinition对象。这个时候的Feature其实成为SPFeatureDefinition对象,并没有被激活到特定的应用程序、网站集或者网站中。
如果需要在服务器场中卸载一个feature,其实只需要把feature从服务器场的FeatureDefinitions集合中删除即可,实现代码如下:
(这个代码等同于uninstallfeature 操作)
SPFarm farm = SPFarm.Local; //通过相对路径删除 farm.FeatureDefinitions.Remove("MyFeature/feature.xml", true); //通过featureID删除 farm.FeatureDefinitions.Remove(fetureid, true); |
可以通过feature定义文件的相对路径删除,或者通过feature的guid删除。
激活或者停用feature需要使用除上述对象模型外的如下对象模型:
Microsoft.SharePoint.SPFeature
Microsoft.SharePoint.SPFeatureCollection
其实,每个应用程序,网站集、网站下都有一个称为Features的SPFeatureCollection属性。
这里需要特别注意,该集合所储存的只是已经在当前级别(应用程序、网站集、网站)已经激活的Feature,如果没有被激活的Feature,是不储存在该集合中的。
那在特定的范围内激活某个特定的Feature,首先需要在服务器场的FeatureDefinitions中找到需要被激活的SPFeatureDefinition,并且该Feature定义的范围与当前范围相同,再通过特定范围(应用程序、网站集、网站)的Features属性进行添加,代码如下:
(等同于activatefeature操作)
SPFarm farm = SPFarm.Local; //通过featurename获取一个feature定义:featuredefiniton,也可以通过guid SPFeatureDefinition featuredefiniton = farm.FeatureDefinitions["featurename"];、 //需要在站点集激活刚才的feature SPSite site = new SPSite("url"); //判断是否相同范围 if(featuredefiniton.Scope == SPFeatureScope.Site) { //判断是否已经在Features集合中,即:是否已经激活 if(site.Features[featuredefiniton.Id]==null) { //在站点集激活feature,其实就是在Features集合中添加一个在服务器场定义的featuredefinition的gu id site.Features.Add(featuredefiniton.Id); } } |
那其实停用激活就很简单了,只需要在特定范围内(应用程序、网站集、网站)的Features集合内删除对应的SPFeature就可以了:
(等同于deactivatefeature操作)
SPSite site = new SPSite("url"); site.Features.Remove(featureid); |
其实通过Reflector查看stsadm,我们可以看到操作其实是不完全相同的。比如,对于激活一个feature,其实是通过SPFeature.ActivateDeactivateFeatureAtScope这个方法来做的,不过这个方法是内部方法,不对外提供调用的。其实还有很多操作都是内部方法,不对外提供调用。而且,微软在关键的方法都加入了混淆,所以具体实现是看不到的。
而对外表现出来的就是通过上述我所描述的方法进行Feature操作的:
在服务器场对象SPFarm定义了名称为FeatureDefinitions 的SPFeatureDefinitionCollection属性,描述了所有安装在服务器场中的feature,这个时候的feature其实是SPFeatureDefinition。
具体的范围(应用程序、网站集合、网站)对象中的名称为Features的SPFeatureCollection属性,只定义了本范围(应用程序、网站集合、网站)已经激活的feature。如果需要激活的话,需要从SPFarm的FeatureDefinitions集合中找到定义,并添加到Features集合中,这个时候的feature是一个SPFeature对象(其实SPFeature对象中也包含了SPFeatureDefinition)。
除此之外,还有SPFeatureDependency对象模型,可以查看某个feature的依赖项,注意,这里的依赖项是只依赖于,而不是被依赖。
SPFeatureProperty: Feature属性。