代码之家  ›  专栏  ›  技术社区  ›  Paul-Jan

SharePoint中的跨方法释放模式

  •  4
  • Paul-Jan  · 技术社区  · 16 年前

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

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

    spsite和spweb都需要处理,并根据 Best Practices 文档此情况称为交叉方法释放模式…只有他们没有给出任何关于如何实现模式的Dispose部分的实际建议。

    我选择让我的类实现IDisposable(在那里处理站点和Web),并让调用者通过 使用 条款。这是根据“最佳实践”,还是我应该以不同的方式处理这个问题?

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

    1 回复  |  直到 16 年前
        1
  •  4
  •   dahlbyk    16 年前

    我认为“交叉方法处理模式”是“最佳实践”中最糟糕的一种。使用依赖项注入为类提供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() .