【转】SPSite、SPWeb对象模型(转winos.cn)
SPSite對象
通常在調用SPSite對象構造函數后,你需要在使用完后調用Dispose方法來清空對象。但是,如果你使用SPControl.GetContextSite來獲取對象那么你不能使用Dispose來清空對象。因為通過這種方式獲得的SPSite或者SPWeb對象會保留一份內部列表信息,當使用Dispose對象后,可能會產生無法預測的錯誤。實際上,WSS會在頁面結束后清空這些對象。
下面,我們分析一下有關SPSite類的方法和屬性會產生對象以及如何清空這些對象
SPSiteCollection類
1.SPSiteCollection.Add方法:通過這個方法會創建并返回一個SPSite對象,在不需要使用該對象后,你應該清除內存中的對象。
例:
SPGlobalAdmin oSPGlobalAdmin? ? = new SPGlobalAdmin();
SPSiteCollection aSites??= oSPGlobalAdmin.VirtualServers[0].Sites;
SPSite oSPSite = aSites.Add( ... );
... Process the site info ...?
oSPSite.Dispose();
oSPGlobalAdmin.Dispose();
通過SPSiteCollection [ ] 索引來獲得SPSite,在下面的例子是沒有及時清除沒有的對象的范例。
int j;
SPSite oSPSite;
SPGlobalAdmin oSPGlobalAdmin? ? = new SPGlobalAdmin();
SPSiteCollection aSites??= oSPGlobalAdmin.VirtualServers[0].Sites;
for (j = 0;j < aSites.Count;j++)
{
? ?oSPSite = aSites[j];
? ?BuildTableRow(oDisplayTable, "Site", oSPSite.Url);
}
oSPGlobalAdmin.Dispose();
這里,我們建議在循環中加入Dispose方法以清空產生的SPSite對象,例:
int j;
SPSite oSPSite;
SPGlobalAdmin oSPGlobalAdmin? ? = new SPGlobalAdmin();
SPSiteCollection aSites??= oSPGlobalAdmin.VirtualServers[0].Sites;
for(j = 0;j < aSites.Count;j++)
{
? ?oSPSite = aSites[j];
? ?BuildTableRow(oDisplayTable, "Site", oSPSite.Url);
? ?oSPSite.Dispose();
}
oSPGlobalAdmin.Dispose();
2.SPSite.AllWebs屬性
SPSites.AllWebs.Add方法:創建并返回SPWeb對象,在不需要使用該對象后,你應該清除內存中的對象,例:
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...?
oSPWeb.Dispose();
3.SPSite.AllWebs [ ] 索引操作在每次訪問對象后會返回SPWeb實例,下面的例子會產生大量SPWeb對象。
int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
for(i=0;j < oSPSite.AllWebs.Count; j++)
{
? ?oSPWeb = oSPSite.AllWebs[j];
? ?BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
}
建議在循環中調用Dispose方法清除對象,例:
int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
for(j = 0;j < oSPSite.AllWebs.Count; j++)
{
? ?oSPWeb = oSPSite.AllWebs[j];
? ?BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
? ?oSPWeb.Dispose();
}
或者:
int j;
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
for(j = 0;j < oSPSite.AllWebs.Count; j++)
{
? ?using(oSPWeb = oSPSite.AllWebs[j])
? ?{
? ?? ?BuildTableRow(oDisplayTable, "Web", oSPWeb.Title);
? ?}
}
4.SPSite.OpenWeb 和 SPSite. SelfServiceCreateSite 方法:這兩個方法都會返回SPWeb對象,你應該按照下面例子方式處理SPWeb對象。
SPSite oSPSite = new SPSite("http://Server");
SPWeb oSPWeb = oSPSite.OpenWeb(..);
... additional processing ...?
oSPWeb.Dispose();
oSPSite.Dispose();
5.SPSite.LockIssue, SPSite.Owner, and SPSite.SecondaryContact 屬性
由于這3個屬性會產生SPSite.RootWeb引用,所以,清空對象方法應該如下:
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.LockIssue;?
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();
6.SPSite.RootWeb 屬性:
在之前提到過RootWeb屬性,在利用RootWeb的屬性后需要使用清空相關對象,例:
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.RootWeb.Title;
... additional processing ...?
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();
SPWeb 對象
1.SPWeb.ParentWeb屬性:第一次調用SPWeb.ParentWeb的時候,它會判斷賦值的成員變量是否是NULL值,如果成員變量為NULL并且上級站點,那么它自動調用OPERWEB方法產生一個SPWeb對象,下次在訪問時候只是返回保存在變量中的值。
例:
String str;
SPSite oSPSite = new SPSite("http://server");
SPWeb oSPWeb, oSPWebParent;
oSPWeb? ?? ? = oSPSite.OpenWeb();
oSPWebParent = oSPWeb.ParentWeb;
if (oSPWebParent != null)
{
? ?... additional processing ...?
}
if (oSPWebParent != null)? ?oSPWebParent.Dispose();
oSPWeb.Dispose();
oSPSite.Dispose();
2.SPWeb.Webs 屬性
SPWeb.Webs.Add 方法:創建并返回SPWeb對象,在不需要使用該對象后,你應該清除內存中的對象,例:
SPWeb oSPWeb
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPSWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...?
oSPWeb.Dispose();
3.SPWeb.Webs[ ] 索引操作和SPSite.Webs相同,在每次訪問對象后會返回SPWeb實例,下面的例子會產生大量SPWeb對象。
int j;
SPWeb oSPWeb, oSPWeb2;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.OpenWeb();
for(j = 0;j < oSPWeb.Webs.Count;j++)
{
? ?oSPWeb2 = oSPWeb.Webs[j];
? ?BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);
}
建議在循環中清除對象。
int j;
SPWeb oSPWeb, oSPWeb2;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.OpenWeb();
for(j = 0;j < oSPWeb.Webs.Count;j++)
{
? ?oSPWeb2 = oSPWeb.Webs[j];
? ?BuildTableRow(oDisplayTable, "Web", oSPWeb2.Title);
? ?oSPWeb2.Dispose();
}
oSPWeb.Dispose();
其他需要清除的對象
1.Microsoft.SharePoint.Portal.SiteData.Area.Web 屬性在每次訪問后返回一個新的SPWeb對象。在使用后應該及時清除對象。
例:
String str;
Area oArea = AreaManager.GetArea(PortalContext.Current, new Guid(AreaGiud);
SPWeb oSPWeb = oArea.Web;
str = oSPweb.Title;
str = oSPWeb.Url;
...?
oSPWeb.Dispose();
或者:
String str;
Area oArea = AreaManager.GetArea(PortalContext.Current, new?
? ?Guid(AreaGiud);
using(SPWeb oSPWeb = oArea.Web)
{
? ?str = oSPweb.Title;
? ?str = oSPWeb.Url;
}
2.SPControl.GetContextSite和 SPControl.GetContextWeb 方法:在前面有提到,這里方法返回對象不能通過Dispose來清除,可能會產生不可預期的錯誤。以下做法是錯誤的:
SPSite oSPSite = SPControl.GetContextSite(..);
... additional processing ...?
oSPSite.Dispose();
正確的方法應該是:
SPSite oSPSite = SPControl.GetContextSite(..);
SPWeb oSPWeb = oSPSite.OpenWeb(..);
... additional processing ...?
oSPWeb.Dispose();
或者:
SPSite oSPSite = SPControl.GetContextSite(..);
using(SPWeb oSPWeb = oSPsite.OpenWeb())
{
? ?... additional processing ...?
}
3.WebPartPage.RootWeb 屬性:和SPSite.RootWeb 屬性相同。只有當WebPartPage.IsRootWeb為True時才需要清除對象,例如:
String str;
WebPartPage oWebPartPage = new WebPartPage();
str = oWebPartPage.RootWeb.Title;
... additional processing ...?
if(oWebPartPage.Web.IsRootWeb
? ?oWebPartPage.Dispose();
大部分Sharepoint對象都實現IDisposable接口,當你不使用對象時應該清除該對象,避免在內存中保存過多對象。
總結
以上是生活随笔為你收集整理的【转】SPSite、SPWeb对象模型(转winos.cn)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生于1995年夏天 终结于2022年夏天
- 下一篇: PowerDesigner怎样才能在修改