Freigeben über


Vorgehensweise: Aktivieren eines Features mit Abhängigkeiten mithilfe von Upgradecode

Letzte Änderung: Dienstag, 21. September 2010

Gilt für: SharePoint Foundation 2010

Die Infrastruktur für das Upgrade von Features erkennt und aktualisiert automatisch Features, die andere von ihnen abhängige Features aufweisen. Wenn Sie also den Abschnitt <ActivationDependencies> Ihrer Datei Feature.xml hinzufügen, müssen Sie keinen spezifischen Upgradecode zum Unterstützen des Upgrades der Features hinzufügen, die vom jeweiligen Feature abhängig sind. Wenn die Aktivierungsabhängigkeit jedoch ein sichtbares Feature ist, das noch nicht aktiviert wurde, müssen Sie Upgradecode für das Feature schreiben, um sicherzustellen, dass Ihr sichtbares Feature, von dem andere Features abhängig sind, während des Upgrades des Features aktiviert wird. Dieses erweiterte Szenario umfasst einen Prozess zum Implementieren von benutzerdefiniertem Upgradecode zum Aktivieren eines sichtbaren Features, von dem andere Features abhängig sind. Das nachfolgende erweiterte Szenario zum Upgrade von Features enthält ein Beispiel dieses Prozesses.

Verwenden von benutzerdefiniertem Upgradecode zum Aktivieren eines Features mit abhängigen Features

  1. Fügen Sie der Datei Feature.xml ein <ActivationDependency>-Tag hinzu. Das <ActivationDependency>-Element hat nun ein MinimumVersion-Attribut zum Bereitstellen von Unterstützung von Featureabhängigkeiten mit Versionsangabe. Im Objektmodell weist die SPFeatureDependency-Klasse eine entsprechende MinimumVersion-Eigenschaft auf, die den Wert zurückgibt, der in der Datei Feature.xml angegeben ist. Featureabhängigkeiten mit Versionsangabe sind hilfreich, wenn Sie sicherstellen möchten, dass die erforderliche Version des Features, das vom jeweiligen Feature abhängt, installiert und aktiviert wird.

  2. Erhöhen Sie die Versionsnummer des Features. Weitere Informationen finden Sie unter Bewährte Methoden für die Verwendung von Featureversionen.

  3. Fügen Sie den Abschnitt <UpgradeActions> der Datei Feature.xml hinzu, und verweisen Sie auf die Assembly und den Typ des Featureempfängers. In diesem Abschnitt wird der Name einer auszuführenden Aktion angegeben. In diesem Beispiel wird die Aktion ActivateFeature an die Implementierung der FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>)-Methode übergeben, die Sie anschließend in Schritt 4 definieren.

    <?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. Implementieren Sie einen Featureempfänger, der von SPFeatureReceiver abgeleitet ist und die FeatureUpgrading(SPFeatureReceiverProperties, String, IDictionary<String, String>)-Methode überschreibt. Wie im folgenden Beispiel dargestellt, kann die Feature-ID, die Sie in Schritt 3 angegeben haben, an die Add()-Methode übergeben werden, um die sichtbaren Features, mit denen im selben Gültigkeitsbereich eine Abhängigkeit besteht, während des Upgrades zu aktivieren.

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