我编写了一个对SharePoint网站内容进行各种修改的类。在该类中,我实现了一个惰性解析属性
private SPWeb rootSite
{
get
{
if ( _site == null )
{
SPSite site = new SPSite( _url );
_site = site.OpenWeb();
}
return _site;
}
}
需要处理SPSite和SPWeb,根据Best Practices文档,这种情况称为交叉方法处理模式......只是他们没有提供任何关于如何实现处理部分模式。
我选择让我的类实现IDisposable(在那里部署网站和网站),并让调用者通过 using 子句访问它。这是根据“最佳做法”,还是我应该以不同的方式处理问题?
请注意,我来自严格的参考计数背景,所以如果我对垃圾处理的看法有些偏差,请纠正我。
答案 0 :(得分:4)
我认为“交叉方式处理模式”是“最佳实践”中最糟糕的。使用依赖注入为您的类提供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();
}
}
}
请注意,调用_web
时会自动处理_site.Dispose()
。