交叉方法在SharePoint中处理模式

时间:2009-09-01 08:23:26

标签: sharepoint dispose

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

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

            return _site;
        }
    }

需要处理SPSite和SPWeb,根据Best Practices文档,这种情况称为交叉方法处理模式......只是他们没有提供任何关于如何实现处理部分模式。

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

请注意,我来自严格的参考计数背景,所以如果我对垃圾处理的看法有些偏差,请纠正我。

1 个答案:

答案 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()