Comment mettre à jour la version de montage SPItemEventReceiver pour une liste dans SharePoint?

StackOverflow https://stackoverflow.com/questions/382535

  •  23-08-2019
  •  | 
  •  

Question

Nous avons un SPItemEventReceiver compilé dans sa propre assemblée.

Nous utilisons STSDEV pour emballer une solution SharePoint avec ce EventReceiver comme une caractéristique. Je ne suis pas déléguant l'SPItemEventReceiver à un ListTemplateId spécifique au sein du elements.xml, mais je suis plutôt un liant ReceiverAssembly dans le feature.xml et l'affectation programmaticaly le SPItemEventReceiver à plusieurs éléments de SPList.

    public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        foreach (SPWeb web in site.AllWebs)
        {
            SPListCollection webListCollection = web.Lists;

            foreach (SPList myList in webListCollection)
            {
                if (myList.Title == "Lab Reports")
                {
                    SPEventReceiverDefinitionCollection receivers = myList.EventReceivers;
                    SPEventReceiverDefinition receiver = receivers.Add();
                    receiver.Name = "PostUpdateLabReport";
                    receiver.Assembly = "LabReportEventHandlers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1111111111111";
                    receiver.Class = "LabReportEventHandlers.LabReportsHandler";
                    receiver.Type = SPEventReceiverType.ItemUpdated;
                    receiver.Update();
                    break;
                }
            }

            web.Dispose();
        }
    }

J'utilise FeatureDeactivating de faire l'inverse du code ci-dessus, la suppression EventReceiver des listes.

Question:

Comment dois-je gérer l'événement futur où LabReportEventHandlers est mis à jour et les changements de version?

Ce sont les options que je peux penser:

  1. fonction Deactivate / Réactiver - J'enveloppez la dll mises à jour dans le fichier de solution SharePoint, changer mon code ci-dessus pour refléter la nouvelle version, et utiliser stsadmin pour mettre à niveau la solution. Je puis désactiver / réactiver la fonction.

  2. Ajouter à la redirection Assemblée web.config.

  3. Ne pas cogner le numéro de version LabReportEventHandlers.

Y at-il quelque chose à changer la version de la solution qui me aider?

Je pense qu'il ya des problèmes avec les 3 options:

  1. Après la désactivation de la fonction, quelqu'un pourrait mettre à jour un élément avant que je puisse reactiave.

  2. Je ne voudrais pas modifier le web.config à la main, donc j'utiliser l'API sharepoint à la place. Où puis-je exécuter ce code?

  3. Ceci est tout simplement faux, mais facile.

Était-ce utile?

La solution

Peut-être que vous pouvez résumer la logique qui est sujette à changement dans un ensemble séparé, qui est référencé et utilisé par votre gestionnaire d'événements. De cette façon, le gestionnaire d'événement lui-même ne changera pas à changer, vous ne déployer l'assembly « logique » mis à jour dans le répertoire GAC ou dans le bac (s) de manière appropriée.

HTH, jt

Autres conseils

Je ne sais pas ce que vous voulez avec la mise à niveau, si vous voulez que le nouveau gestionnaire d'événements à appliquer aux anciennes listes ou tout simplement pour les nouvelles listes.

Pour la mise à niveau des listes que vous pouvez mettre de nouvelles informations d'assemblage dans un fichier séparé, lisez ce fichier dans votre méthode FeatureActivated et appliquer les nouvelles valeurs. Lors de la mise à niveau tout ce que vous devez faire est de mettre à jour le fichier de configuration séparé et toute nouvelle activation utilisera les nouvelles valeurs et les numéros de version.

Si vous devez mettre à jour les anciens gestionnaires d'événements que vous pourriez faire une procédure similaire, mais ajouter le nouveau récepteur fonction avant de supprimer l'ancien. Si vous faites cela dans la même méthode le temps entre l'ajout du nouveau gestionnaire et supprimant l'ancien sera minime et la chance de quelqu'un d'ajouter un élément à l'heure exacte est proche de zéro. Si vous voulez aller tout le chemin à zéro, vous pouvez masquer la liste ou avoir un gestionnaire d'événements ItemUpdated supplémentaire qui vérifie si une mise à jour est en cours et si la mise à jour de façon arrête.

Donc, en bref: Pour de nouvelles listes, lisez config de montage de fichier externe Pour les anciennes listes, ajouter des informations d'assemblage amélioré juste avant d'enlever l'ancien gestionnaire.

.B

Je n'utilise que versionnage de montage s'il y a un besoin pour les deux (anciens et nouveaux) versions de l'assemblage à exécuter. Je ne ai jamais besoin de ce sur un récepteur d'événements. Par conséquent, je ne change pas la version d'assemblage pour les récepteurs d'événements.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top