SharePoint中的跨方法处理模式
我编写了一个类,它对SharePoint网站的内容进行各种修改。在该类中,我实现了一个惰性解析属性SharePoint中的跨方法处理模式,sharepoint,dispose,Sharepoint,Dispose,我编写了一个类,它对SharePoint网站的内容进行各种修改。在该类中,我实现了一个惰性解析属性 private SPWeb rootSite { get { if ( _site == null ) { SPSite site = new SPSite( _url ); _site = site.OpenWeb();
private SPWeb rootSite
{
get
{
if ( _site == null )
{
SPSite site = new SPSite( _url );
_site = site.OpenWeb();
}
return _site;
}
}
SPSite和SPWeb都需要处理,根据文档,这种情况称为交叉方法处理模式。。。只是他们没有就如何实现模式的dispose部分给出任何实际建议
我选择让我的类实现IDisposable(在那里处理站点和web),并让调用方通过using子句访问它。这是根据“最佳实践”,还是我应该以不同的方式处理问题
请注意,我来自一个严格的参考计数背景,所以请纠正我,如果我对垃圾处理的看法有点偏离>P>我认为“交叉方法处理模式”是“最佳实践”中最差的。使用依赖项注入为类提供SPSite或SPWeb引用几乎总是更好的,可能是通过构造函数。这样,您的类就没有处理问题,它只使用SharePoint上下文
也就是说,如果您希望继续使用此模式,那么实现IDisposable
是正确的方法。但是,您应该跟踪和处理SPSite
,而不是SPWeb
。我可以这样实现它:
public class MyClass : IDisposable
{
private string _url;
private SPSite _site;
private SPWeb _web;
private SPSite RootSite
{
get
{
if ( _site == null )
{
_site = new SPSite( _url );
}
return _site;
}
}
private SPWeb RootWeb
{
get
{
if ( _web == null )
{
_web = RootSite.OpenWeb();
}
return _web;
}
}
void IDisposable.Dispose()
{
if (null != _site)
{
_site.Dispose();
}
}
}
请注意,
\u web
将通过调用\u site.Dispose()
自动处理。关于该模式,只需假设我的依赖项注入容器(或简单调用方)具有lazy resolving属性,将问题转移到那里。(当然是j/k)关于不需要处理web的观点很好,我刚刚读到SPSite的SPWeb跟踪,对此我并不知道。