2

独自のアセンブリにコンパイルされた SPItemEventReceiver があります。

STSDev を使用して、この EventReceiver をフィーチャーとして SharePoint ソリューションをパッケージ化しています。SPItemEventReceiver を elements.xml 内の特定の ListTemplateId に割り当てるのではなく、feature.xml 内で ReceiverAssembly をリンクし、SPItemEventReceiver を複数の 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();
        }
    }

私は FeatureDeactivating を使用して上記のコードの逆を行い、リストから EventReceiver を削除しています。

質問:

LabReportEventHandlers が更新され、バージョンが変更される将来のイベントをどのように処理すればよいですか?

これらは私が考えることができるオプションです:

  1. 非アクティブ化/再アクティブ化機能 -- 更新された dll を SharePoint ソリューション ファイルにラップし直し、上記のコードを変更して新しいバージョンを反映させ、stsadmin を使用してソリューションをアップグレードします。次に、機能を非アクティブ化/再アクティブ化します。

  2. アセンブリ リダイレクトを web.config に追加します。

  3. LabReportEventHandlers のバージョン番号を上げないでください。

ソリューションのバージョンを変更すると、何か役立つことがありますか?

3つのオプションには問題があると思います:

  1. 機能を無効にした後、私が再度有効にする前に誰かがアイテムを更新する可能性があります。

  2. web.config を手動で編集したくないので、代わりに sharepoint API を使用します。そのコードをどこで実行しますか?

  3. これは単純に間違っていますが、簡単です。

4

3 に答える 3

1

おそらく、イベント ハンドラーによって参照および使用される別のアセンブリに変更されやすいロジックをカプセル化できます。この方法では、イベント ハンドラー自体を変更する必要はありません。更新された「ロジック」アセンブリを GAC または bin ディレクトリに適切にデプロイするだけです。

HTH、jt

于 2008-12-21T18:51:00.473 に答える
0

新しいイベント ハンドラを古いリストに適用するか、新しいリストだけに適用するか、アップグレードで何が必要かわかりません。

新しいリストだけをアップグレードするには、アセンブリ情報を別のファイルに入れ、そのファイルを FeatureActivated メソッドで読み取り、新しい値を適用します。アップグレードするときは、別の構成ファイルを更新するだけでよく、新しいアクティベーションでは新しい値とバージョン番号が使用されます。

古いイベント ハンドラーをアップグレードする必要がある場合は、同様の手順を実行できますが、古いものを削除する前に新しいフィーチャー レシーバーを追加します。これを同じ方法で行うと、新しいハンドラーを追加してから古いハンドラーを削除するまでの時間が最小限になり、その正確な時間に誰かがアイテムを追加する可能性はゼロに近くなります。完全にゼロにしたい場合は、リストを非表示にするか、アップグレードが進行中かどうかを確認し、進行中の場合は更新を停止する ItemUpdated イベント ハンドラーを追加することができます。

要するに、新しいリストの場合は、外部ファイルからアセンブリ構成を読み取り、古いリストの場合は、古いハンドラーを削除する直前に、アップグレードされたアセンブリ情報を追加します。

.b

于 2008-12-20T06:28:24.827 に答える
0

アセンブリのバージョン管理は、(古いバージョンと新しいバージョンの) 両方のアセンブリを実行する必要がある場合にのみ使用します。イベントレシーバーでこれを必要としたことはありません。したがって、イベント レシーバーのアセンブリ バージョンは変更しません。

于 2010-02-04T20:29:51.797 に答える