跨方法Dispose模式在SharePoint(Cross Method Dispose Patte

2019-08-03 07:04发布

我写了一个类,做各种修改SharePoint网站的内容。 这个类里面,我已经实现了一个懒惰的解决财产

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

            return _site;
        }
    }

无论是的SPSite和的SPWeb需要处理,并根据最佳实践文档这种情况被称为交叉法Dispose模式......只有他们不给就如何落实该模式的处置部分的任何实际的建议。

我选择有我的类实现IDisposable(配置网站和网页那里),并有通过使用条款调用者访问它。 请问,根据“最佳做法”是,或者我应该有不同的处理这个问题?

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

Answer 1:

我认为“十字交叉法Dispose模式”是最糟糕的“最佳实践”的。 它几乎总是更好的使用依赖注入来提供的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()



文章来源: Cross Method Dispose Patterns in SharePoint