Partager via


Procédure : utiliser du code de mise à niveau pour activer un Composant fonctionnel comportant des dépendances

Dernière modification : mardi 21 septembre 2010

S’applique à : SharePoint Foundation 2010

L’infrastructure de mise à niveau de Composants fonctionnels détecte et met à niveau automatiquement les Composants fonctionnels dont dépendent d’autres Composants fonctionnels ; par conséquent, si vous ajoutez une section <ActivationDependencies> à votre fichier Feature.xml, vous n’avez pas besoin d’ajouter de code de mise à niveau spécifique pour prendre en charge la mise à niveau de Composants fonctionnels dont dépendent d’autres Composants fonctionnels. Toutefois, si la dépendance d’activation est un Composant fonctionnel visible qui n’a pas encore été activé, vous devez écrire du code de mise à niveau de Composants fonctionnels pour que votre Composant fonctionnel visible, dont dépendent d’autres Composants fonctionnels, soit activé pendant la mise à niveau de Composants fonctionnels. Ce scénario avancé comporte un processus qui vise à implémenter du code de mise à niveau personnalisé pour activer un Composant fonctionnel visible dont dépendent d’autres Composants fonctionnels. Un exemple de ce processus est décrit dans le scénario de mise à niveau de Composants fonctionnels avancé suivant.

Utilisation d’un code de mise à niveau personnalisé pour activer un Composant fonctionnel comportant des dépendances de Composant fonctionnel

  1. Ajoutez une balise <ActivationDependency> dans le fichier Feature.xml. L’élément <ActivationDependency> possède maintenant un attribut MinimumVersion qui permet de prendre en charge les dépendances de Composant fonctionnel avec version. Dans le modèle objet, la classe SPFeatureDependency possède une propriété MinimumVersion correspondante qui retourne la valeur spécifiée dans le fichier Feature.xml. Les dépendances de Composant fonctionnel vous permettent de vous assurer que la version requise du Composant fonctionnel dont dépendent d’autres Composants fonctionnels est installée et activée.

  2. Augmentez le numéro de version du Composant fonctionnel. Pour plus d’informations, voir Meilleures pratiques pour l’utilisation de versions de Composant fonctionnel.

  3. Ajoutez une section <UpgradeActions> dans le fichier Feature.xml et référencez l’assembly et le type du récepteur de fonctionnalités. Cette section spécifie le nom d’une action à effectuer. Dans cet exemple, l’action « ActivateFeature » est transmise à l’implémentation de la méthode FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>) que vous définissez ensuite à l’étape 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. Implémentez un récepteur de fonctionnalités qui dérive de SPFeatureReceiver et qui substitue la méthode FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>). Comme illustré dans l’exemple suivant, l’identificateur de Composant fonctionnel que vous spécifiez à l’étape 3 peut être transmis à la méthode Add() afin que soient activés pendant la mise à niveau les Composants fonctionnels dont dépendent d’autres Composants fonctionnels visibles et qui possèdent la même étendue.

    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);
                }
            }
        }
    }