Распределение кроссовых шаблонов в SharePoint - PullRequest
4 голосов
/ 01 сентября 2009

Я написал класс, который вносит различные изменения в содержимое сайта SharePoint. Внутри этого класса я реализовал ленивое разрешенное свойство

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

            return _site;
        }
    }

И SPSite, и SPWeb должны быть утилизированы, и в соответствии с документом Best Practices эта ситуация называется перекрестным шаблоном утилизации ... только они не дают никаких реальных советов о реализовать утилизировать часть шаблона.

Я решил, чтобы мой класс реализовал IDisposable (удаляя сайт и сеть там), и чтобы вызывающий абонент имел к нему доступ через , используя предложение . Было бы это в соответствии с «лучшими практиками», или я должен был решить проблему по-другому?

Обратите внимание, что я пришел со строгим опытом подсчета ссылок, поэтому, пожалуйста, исправьте меня, если мои взгляды на удаление мусора немного отличаются.

1 Ответ

4 голосов
/ 01 сентября 2009

Я считаю, что «Шаблон перекрестного метода утилизации» является худшим из «Лучших практик». Почти всегда лучше использовать внедрение зависимостей, чтобы предоставить ссылку на 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().

...