我想知道实例化SPSite和SPWeb对象的最佳方法是什么。因为没有。你可以做this.Some我知道的方法
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;请让我知道,在这些方法中,有没有其他最好的方法或方法,那应该是实例化对象的最佳方法.
谢谢,
发布于 2010-01-24 02:40:30
你应该这样做:
using(SPSite oSPsite = new SPSite("http://server"))
{
using(SPWeb oSPWeb = oSPSite.OpenWeb())
{
// do stuff
}
} 您还应该研究一下SharePoint Dispose Checker Tool,因为它可以检查您的代码,并指出您缺少最佳实践的地方。
EDIT:是的,你可以使用Context (我一直都是这样做的),但它不应该在某些情况下使用,比如在SPSecurity.RunWithElevatedPrivileges中。因此,我建议:
不应使用用于RunWithElevatedPrivileges and
3的普通operations
2的RunWithElevatedPrivileges方法,因为如果释放该方法,可能会弄乱您的请求。发布于 2010-01-25 03:41:24
基本上,创建一个新的 SPSite对象在所需内存方面是“昂贵的”。这就是为什么你会尽可能的使用have to Dispose() --释放你占用的资源。
因此,只要有这样的方法可用,就应该调用使用内置到SharePoint中的“单例”的方法。例如,在您的第三个示例中,您调用SPContext.Current.Web。在内部(如果您在Reflector中加载代码,则可以看到它)它存储对SPWeb对象的引用,并在每次调用它时返回相同的对象。这意味着同一页中的不同web控件使用一个SPSite对象和一个SPWeb对象。但是,您的第二个示例创建了一个新的SPSite对象,这会占用您2Mb的内存(信息取自Robert Lamb's article)。
在我看来,第一种方法和第三种方法是等价的。其中一个方法在内部调用另一个方法(我目前无法访问microsoft.sharepoint.dll,因此无法验证)。
第二个例子是不同的。
发布于 2010-01-25 08:41:46
没有一种最好的方法,这取决于你在做什么。如果您在编写代码时知道您可以访问当前/隐式上下文,例如web部件,则选项#1更可取。这种“搭载”在当前的上下文中,速度更快,节省了资源。Rubens Farias的帖子提供了一些关于限制的额外细节。
有时,您没有当前/隐式上下文,例如在命令行实用程序中。有时,您希望访问当前上下文之外的对象,例如在另一个web应用程序中。在这些情况下,你只剩下选项#2,它会旋转出它自己的上下文。
我倾向于将选项#3看作是选项#1的冗余和表达能力较差的版本。其他人可能能够提供一个令人信服的使用案例,但我没有遇到它。
这两种方法(当前上下文和显式上下文)都工作得很好,应该在您的工具箱中。关键是知道为什么以及如何在给定的情况下使用一种方法与另一种方法。
https://stackoverflow.com/questions/2124065
复制相似问题