【转】SPSite、SPWeb对象模型(转winos.cn)
SPSite對(duì)象
通常在調(diào)用SPSite對(duì)象構(gòu)造函數(shù)后,你需要在使用完后調(diào)用Dispose方法來(lái)清空對(duì)象。但是,如果你使用SPControl.GetContextSite來(lái)獲取對(duì)象那么你不能使用Dispose來(lái)清空對(duì)象。因?yàn)橥ㄟ^(guò)這種方式獲得的SPSite或者SPWeb對(duì)象會(huì)保留一份內(nèi)部列表信息,當(dāng)使用Dispose對(duì)象后,可能會(huì)產(chǎn)生無(wú)法預(yù)測(cè)的錯(cuò)誤。實(shí)際上,WSS會(huì)在頁(yè)面結(jié)束后清空這些對(duì)象。
下面,我們分析一下有關(guān)SPSite類的方法和屬性會(huì)產(chǎn)生對(duì)象以及如何清空這些對(duì)象
SPSiteCollection類
1.SPSiteCollection.Add方法:通過(guò)這個(gè)方法會(huì)創(chuàng)建并返回一個(gè)SPSite對(duì)象,在不需要使用該對(duì)象后,你應(yīng)該清除內(nèi)存中的對(duì)象。
例:
SPGlobalAdmin oSPGlobalAdmin? ? = new SPGlobalAdmin();
SPSiteCollection aSites??= oSPGlobalAdmin.VirtualServers[0].Sites;
SPSite oSPSite = aSites.Add( ... );
... Process the site info ...?
oSPSite.Dispose();
oSPGlobalAdmin.Dispose();
通過(guò)SPSiteCollection [ ] 索引來(lái)獲得SPSite,在下面的例子是沒(méi)有及時(shí)清除沒(méi)有的對(duì)象的范例。
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();
這里,我們建議在循環(huán)中加入Dispose方法以清空產(chǎn)生的SPSite對(duì)象,例:
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方法:創(chuàng)建并返回SPWeb對(duì)象,在不需要使用該對(duì)象后,你應(yīng)該清除內(nèi)存中的對(duì)象,例:
SPWeb oSPWeb;
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...?
oSPWeb.Dispose();
3.SPSite.AllWebs [ ] 索引操作在每次訪問(wèn)對(duì)象后會(huì)返回SPWeb實(shí)例,下面的例子會(huì)產(chǎn)生大量SPWeb對(duì)象。
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);
}
建議在循環(huán)中調(diào)用Dispose方法清除對(duì)象,例:
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 方法:這兩個(gè)方法都會(huì)返回SPWeb對(duì)象,你應(yīng)該按照下面例子方式處理SPWeb對(duì)象。
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個(gè)屬性會(huì)產(chǎn)生SPSite.RootWeb引用,所以,清空對(duì)象方法應(yīng)該如下:
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.LockIssue;?
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();
6.SPSite.RootWeb 屬性:
在之前提到過(guò)RootWeb屬性,在利用RootWeb的屬性后需要使用清空相關(guān)對(duì)象,例:
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.RootWeb.Title;
... additional processing ...?
oSPSite.RootWeb.Dispose();
oSPSite.Dispose();
SPWeb 對(duì)象
1.SPWeb.ParentWeb屬性:第一次調(diào)用SPWeb.ParentWeb的時(shí)候,它會(huì)判斷賦值的成員變量是否是NULL值,如果成員變量為NULL并且上級(jí)站點(diǎn),那么它自動(dòng)調(diào)用OPERWEB方法產(chǎn)生一個(gè)SPWeb對(duì)象,下次在訪問(wèn)時(shí)候只是返回保存在變量中的值。
例:
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 方法:創(chuàng)建并返回SPWeb對(duì)象,在不需要使用該對(duì)象后,你應(yīng)該清除內(nèi)存中的對(duì)象,例:
SPWeb oSPWeb
SPSite oSPSite = SPControl.GetContextSite(Context);
oSPSWeb = oSPSite.AllWebs.Add( ... );
... Process the SPWeb info ...?
oSPWeb.Dispose();
3.SPWeb.Webs[ ] 索引操作和SPSite.Webs相同,在每次訪問(wèn)對(duì)象后會(huì)返回SPWeb實(shí)例,下面的例子會(huì)產(chǎn)生大量SPWeb對(duì)象。
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);
}
建議在循環(huán)中清除對(duì)象。
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();
其他需要清除的對(duì)象
1.Microsoft.SharePoint.Portal.SiteData.Area.Web 屬性在每次訪問(wèn)后返回一個(gè)新的SPWeb對(duì)象。在使用后應(yīng)該及時(shí)清除對(duì)象。
例:
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 方法:在前面有提到,這里方法返回對(duì)象不能通過(guò)Dispose來(lái)清除,可能會(huì)產(chǎn)生不可預(yù)期的錯(cuò)誤。以下做法是錯(cuò)誤的:
SPSite oSPSite = SPControl.GetContextSite(..);
... additional processing ...?
oSPSite.Dispose();
正確的方法應(yīng)該是:
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 屬性相同。只有當(dāng)WebPartPage.IsRootWeb為True時(shí)才需要清除對(duì)象,例如:
String str;
WebPartPage oWebPartPage = new WebPartPage();
str = oWebPartPage.RootWeb.Title;
... additional processing ...?
if(oWebPartPage.Web.IsRootWeb
? ?oWebPartPage.Dispose();
大部分Sharepoint對(duì)象都實(shí)現(xiàn)IDisposable接口,當(dāng)你不使用對(duì)象時(shí)應(yīng)該清除該對(duì)象,避免在內(nèi)存中保存過(guò)多對(duì)象。
總結(jié)
以上是生活随笔為你收集整理的【转】SPSite、SPWeb对象模型(转winos.cn)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 生于1995年夏天 终结于2022年夏天
- 下一篇: PowerDesigner怎样才能在修改