4

我编写了一个对 SharePoint 网站内容进行各种修改的类。在那个类中,我实现了一个惰性解析属性

    private SPWeb rootSite
    {
        get 
        {
            if ( _site == null )
            {
                SPSite site = new SPSite( _url );
                _site = site.OpenWeb();
            }

            return _site;
        }
    }

SPSite 和 SPWeb 都需要处置,根据最佳实践文档,这种情况称为跨方法处置模式......只是他们没有就如何实现模式的处置部分给出任何实际建议。

我选择让我的班级实现 IDisposable(在那里放置网站和 Web),并让调用者通过using子句访问它。那是根据“最佳实践”,还是我应该以不同的方式处理问题?

请注意,我来自严格的引用计数背景,所以如果我对垃圾处理的看法有点偏离,请纠正我。

4

1 回答 1

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().

于 2009-09-01T16:40:05.217 回答