SharePoint中的跨方法处理模式

SharePoint中的跨方法处理模式,sharepoint,dispose,Sharepoint,Dispose,我编写了一个类,它对SharePoint网站的内容进行各种修改。在该类中,我实现了一个惰性解析属性 private SPWeb rootSite { get { if ( _site == null ) { SPSite site = new SPSite( _url ); _site = site.OpenWeb();

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

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

            return _site;
        }
    }
SPSite和SPWeb都需要处理,根据文档,这种情况称为交叉方法处理模式。。。只是他们没有就如何实现模式的dispose部分给出任何实际建议

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

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

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

请注意,
\u web
将通过调用
\u site.Dispose()

自动处理。关于该模式,只需假设我的依赖项注入容器(或简单调用方)具有lazy resolving属性,将问题转移到那里。(当然是j/k)关于不需要处理web的观点很好,我刚刚读到SPSite的SPWeb跟踪,对此我并不知道。