实例化SPSite和SPWeb对象

时间:2010-01-23 17:52:03

标签: sharepoint

我想知道什么是实例化SPSite和SPWeb对象的最佳方法。因为没有。你可以这样做的方式。我知道的一些方法

1. 
SPSite mySite = SPControl.GetContextSite(Context);
            SPWeb myWeb = SPControl.GetContextWeb(Context);

//为什么我们在第一种方法中使用第二种方法,不需要编写硬编码的URL,也不需要按照Microsoft的建议进行处理。

2. 
SPSite mySite=new SPSite("http://abc");
SPWeb myweb= mySite.RootWeb;
//Dispose
mySite.Dispose();
myweb.Dispose();

  or difff. way of disposing for it by having using( )

/

   3. Similar to first.. SPSite mySite = SPContext.Current.Site;
                         SPWeb myweb = SPContext.Current.Web;

让我知道是否还有其他最佳方法或手段,这些方法或方法应该是实例化对象的最佳方法.....

谢谢,

4 个答案:

答案 0 :(得分:3)

你应该这样做:

using(SPSite oSPsite = new SPSite("http://server"))
{
    using(SPWeb oSPWeb = oSPSite.OpenWeb())
    {
        // do stuff
    }
} 

您还应该看一下:SharePoint Dispose Checker Tool,因为它可以检查您的代码并指出您错过最佳做法的位置。

编辑:是的,您可以使用Context(这是我一直这样做的)但不应该在某些情况下使用,例如在SPSecurity.RunWithElevatedPrivileges内部。所以,我建议:

  • 1正常操作方法
  • 2代表RunWithElevatedPrivileges
  • 不应该使用
  • 3,因为可能会在处理后弄乱您的请求。

答案 1 :(得分:1)

基本上,创建 SPSite对象就其所需的内存来说是“昂贵的”。这就是为什么你尽可能have to Dispose()他们 - 释放你所拥有的资源。

因此,只要有这样的方法,就应该调用使用SharePoint内置的“单例”的方法。例如,在第3个示例中,您调用SPContext.Current.Web。在内部(您可以看到它,如果您在Reflector中加载代码)它会存储对SPWeb对象的引用,并在每次调用时返回相同的对象。这意味着同一页面中的不同Web控件使用一个SPSite对象和一个SPWeb对象。但是,您的第二个示例创建了一个新的SPSite对象,并且需要2Mb的内存(来自Robert Lamb's article的信息)。

在我看来,第一种和第三种方法是等价的。其中一个方法在内部调用另一个(我暂时无法访问microsoft.sharepoint.dll,所以我无法验证)。
第二个例子是不同的。

答案 2 :(得分:1)

没有一种最好的方法,这取决于你在做什么。如果您正在编写代码,而您知道可以访问当前/隐式上下文(例如Web部件),则最好选项#1。在当前环境中“捎带”,速度更快,节省资源。鲁本斯法里亚斯的帖子提供了一些有关限制的额外细节。

有时您没有当前/隐式上下文,例如在命令行实用程序中。有时您想要访问当前上下文之外的对象,例如在另一个Web应用程序中。在这些情况下,你留下选项#2,它会旋转自己的上下文。

我倾向于将选项#3视为选项#1的冗余和不那么富有表现力的版本。其他人可能会提供一个令人信服的案例供其使用,但我没有碰到它。

这两种方法(当前与显式上下文)都运行良好,应该在您的工具箱中。关键是要了解为什么以及如何在特定情况下采用一种方法与另一种方法。

答案 3 :(得分:0)

方法1和3是等效的。事实上,SPContext(方法3)正在使用方法1本身。 我更喜欢使用SPContext.Current,因为当你还想使用SPContect.Current.List等时,它提供了一个很好的一致性,这是SPControl无法提供的

方法2适用于您未在相关网站内运行代码的情况,因此,如果您要创建控制台/ WPF应用程序或stsadm的扩展程序。

如果您需要使用提升的权限运行,请使用方法2的变体,将Guid和SPUserToken作为参数

总之,我的建议是:如果可以,请使用方法3,当需要时使用方法2