我编写了一个类,可以对 SharePoint 网站的内容进行各种修改。在该类中,我实现了一个惰性解析属性
private SPWeb rootSite
{
get
{
if ( _site == null )
{
SPSite site = new SPSite( _url );
_site = site.OpenWeb();
}
return _site;
}
}
SPSite和SPWeb都需要处置,根据最佳实践 http://msdn.microsoft.com/en-us/aa973248.aspx文档中这种情况称为交叉方法处置模式...只是他们没有给出有关如何实现模式的处置部分的任何实际建议。
我选择让我的类实现 IDisposable (在那里处理站点和网络),并让调用者通过using条款。这是根据“最佳实践”,还是我应该以不同的方式处理问题?
请注意,我来自严格的引用计数背景,所以如果我对垃圾处理的看法有点偏差,请纠正我。
我认为“跨方法处置模式”是“最佳实践”中最糟糕的。最好使用依赖注入来提供 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()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)