Compartir a través de


Procedimiento para usar código de actualización para activar una característica con dependencias

Última modificación: martes, 21 de septiembre de 2010

Hace referencia a: SharePoint Foundation 2010

La infraestructura de actualización de características detecta y actualiza automáticamente las características de las cuales dependen otras características, por lo que si se agrega una sección <ActivationDependencies> al archivo Feature.xml, no es necesario agregar ningún código de actualización específico para admitir la actualización de características de las cuales otras dependen. Sin embargo, si la dependencia de activación es una característica visible que todavía no se ha activado, debe escribir código de actualización de características para asegurarse de que la característica visible, de la cual dependen otras características, se active durante la actualización de características. Este escenario avanzado conlleva un proceso para implementar código de actualización personalizado para activar una característica visible de la cual dependen otras características. Un ejemplo de este proceso se describe en el siguiente escenario de actualización de características avanzado.

Uso de código de actualización personalizado para activar una característica que tiene dependencias de característica

  1. Agregue una etiqueta <ActivationDependency> en el archivo Feature.xml. El elemento <ActivationDependency> ahora tiene un atributo MinimumVersion para proporcionar compatibilidad con dependencias de característica con versiones. En el modelo de objetos, la clase SPFeatureDependency tiene una propiedad MinimumVersion correspondiente que devuelve el valor especificado en el archivo Feature.xml. Las dependencias de característica con versiones son útiles cuando se desea garantizar que se instale y active la versión correcta de la característica "de la cual otras dependen".

  2. Incremente el número de versión de la característica. Para obtener más información, vea Procedimientos recomendados para el uso de versiones de característica.

  3. Agregue una sección <UpgradeActions> en el archivo Feature.xml y haga referencia al ensamblado y tipo del receptor de características. Esta sección especifica el nombre de la acción que se realizará. En este ejemplo, la acción "ActivateFeature" se pasa a la implementación del método FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>) que se define posteriormente en el paso 4.

    <?xml version="1.0" encoding="utf-8"?>
    <Feature 
      Id = "712224F9-6708-4965-A18C-B73CA86AEFCA"
      ReceiverAssembly = "MyFeatureReceiver, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 3ef91b1292056a22"
      ReceiverClass = "MyFeatureReceiver.MyReceiver"
      Title="My Feature" 
      Description="My feature" 
      Version="2.0.0.0"
      ImageUrl="MyFeature.gif"
      Scope="Site" 
      Hidden="FALSE"
      DefaultResourceFile="core"
      xmlns="https://schemas.microsoft.com/sharepoint/">
      <ElementManifests>
        <ElementManifest Location="Elements.xml" />
        <ElementManifest Location="Elements2.xml" />
      </ElementManifests>
      <ActivationDependencies>
        <ActivationDependency FeatureId="3A4CE811-6FE0-4e97-A6AE-675470282CF2" />
      </ActivationDependencies>
      <UpgradeActions
        ReceiverAssembly="MyFeatureReceiver, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3ef91b1292056a22" 
        ReceiverClass="MyFeatureReceiver.MyReceiver">
        <VersionRange EndVersion="2.0.0.0">
          <CustomUpgradeAction Name="ActivateFeature"/>
          <ApplyElementManifests>
            <ElementManifest Location="Elements2.xml"/>
          </ApplyElementManifests>
        </VersionRange>
      </UpgradeActions>
    </Feature>
    
  4. Implemente un receptor de características que derive de SPFeatureReceiver y que invalide al método FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>). Como se muestra en el ejemplo siguiente, el identificador de característica especificado en el paso 3 se puede pasar al método Add() para activar las características visibles "de las cuales otras dependen" del mismo ámbito durante la actualización.

    public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, IDictionary<string, string> parameters)
    {
        if(upgradeActionName != "ActivateFeature")
        return;
        // Get the current Feature that is being upgraded.
        SPFeature thisFeature = properties.Feature;
     
        // Get the parent of the current Feature.
        object featureParent = thisFeature.Parent;
     
        // Get the appropriate Feature collection, based on scope.
        SPFeatureCollection featureCollection = null;
        switch (thisFeature.Definition.Scope)
        {
            case SPFeatureScope.Farm:
                
                featureCollection = ((SPWebService) featureParent).Features;
                break;
     
            case SPFeatureScope.WebApplication:
     
                featureCollection = ((SPWebApplication) featureParent).Features;
                break;
     
            case SPFeatureScope.Site:
     
                featureCollection = ((SPSite) featureParent).Features;
                break;
     
            case SPFeatureScope.Web:
     
                featureCollection = ((SPWeb) featureParent).Features;
                break;
        }
     
        // Get the Feature dependencies.
        SPFeatureDependencyCollection featureDepdencyCollection = thisFeature.Definition.ActivationDependencies;
     
        /* Loop over each dependency and activate it if it has same scope and was not already activated.*/
        foreach (SPFeatureDependency featureDependency in featureDepdencyCollection)
        {
            // Get the depended-upon Feature definition.
            SPFeatureDefinition dependedUponFeatureDefinition = null;
            try
            {
                dependedUponFeatureDefinition = SPFarm.Local.FeatureDefinitions[featureDependency.FeatureId];
            }
            catch { }
     
            // Get the depended-upon Feature.
            SPFeature dependedUponFeature = null;
            try
            {
                dependedUponFeature = featureCollection[featureDependency.FeatureId];
            }
            catch { }
     
            // Get the depended-upon Feature scope.
            if (dependedUponFeatureDefinition != null && dependedUponFeature == null)
            {
                if (dependedUponFeatureDefinition.Scope == thisFeature.Definition.Scope)
                {
                    featureCollection.Add(dependedUponFeatureDefinition.Id);
                }
            }
        }
    }