web-dev-qa-db-ja.com

SPSiteサイト=新しいSPSite(SPContext.Current.Web.Url)とSPContext.Current.Web.Site

一部のSharePointサンプルが使用される理由

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
    ...
}

単純にではなく?

SPSite site = SPContext.Current.Web.Site;
...

更新

質問は次のように絞り込んだと思います。

SPContent.Currentを直接使用しないでください。コードがSharePoint内で実行されていることが確実でない限りです。しかし、それが真実ではないのはいつでしょうか。

15
Jan Aagaard

Microsoftによる SharePoint 2010でのオブジェクトの破棄 に関するベストプラクティスドキュメントをご覧ください。ただし、 反対するビュー があります。

SharePointプロジェクトには、いくつか重要なポイントがあります。

  • 常にyourSPWeb/SPSiteオブジェクトを破棄->メモリリーク
  • コードがSharePointコンテキストで実行されていることが確実な場合は、SPContext.Current ...を使用してください
    • ユニットテストはSharepointコンテキストがないことを意味します
    • 外部ユーティリティはSharePointコンテキストがないことを意味します
    • PowershellはSharePointコンテキストがないことを意味します(例:機能レシーバーでの機能のアクティブ化が失敗する可能性があります)
  • SPContext.Currentを破棄しないでください...独自のオブジェクトを作成します(ここでもusing

複数のSP ..オブジェクトで 一貫性の問題 が発生する可能性があります。

結局のところ、_SPSite site = SPContext.Current.Web.Site;_は場合によっては問題ありませんが、このsiteオブジェクトを制御することはできません。これが問題である可能性があります。 new SPSite(...)を使用する場合、SharePointが作成して管理するものではなく、常にyourSPSiteになります。

個人的には、ほとんどの場合using構造を使用するため、すべてのオブジェクトは後で適切に破棄されます。あるいは、破棄せずに_SPContext.Current.Web_を使用します。

11
Dennis G

コードが実行されるコンテキストによって異なります。たとえば、SPSiteブロック内で実行している場合は、新しいRunWithElevatedPrivilegesインスタンスを作成する必要があります。

4

デニスGは正しいです。 SPSite/SPWeb/etcを破棄することは重要ですが、APIから直接提供されたオブジェクトを破棄しないでください。微妙ですが重要です。それ以外の場合、応答が生成されないか、スレッドの異常終了の状況が発生することはありません。私の経験では、ユーザーコンテキスト(コンテンツマネージャーの承認済みユーザーまたは匿名)が確実に利用できるSPSiteまたはSPWebプロパティの簡単な情報が必要な場合は、SPContext.Current。*オブジェクトを使用すると便利です。それ以外の場合は、RunWithElevatedPrivelegesメソッドを使用してコードをラップし、そのラムダ内に次のパターンを含めます。

SPSecurity.RunWithElevatedPrivileges(() =>
{
  using (SPSite site = new SPSite(SPContext.Current.Site.ID))
  {
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
    {
     // stuff goes here elevated
    }
  }
});
0
Roman