создавать экземпляры объектов SPSite и SPWeb - PullRequest
0 голосов
/ 23 января 2010

Я хочу знать, каков наилучший метод создания объектов SPSite и SPWeb. Как нет. способов, которыми вы можете сделать это. Некоторые из способов, которые я знаю

1. 
SPSite mySite = SPControl.GetContextSite(Context);
            SPWeb myWeb = SPControl.GetContextWeb(Context);

// Почему мы используем второй метод, так как в первом методе нет необходимости писать жестко запрограммированный URL-адрес, а также нет необходимости использовать его в соответствии с рекомендациями Microsoft.

2. 
SPSite mySite=new SPSite("http://abc");
SPWeb myweb= mySite.RootWeb;
//Dispose
mySite.Dispose();
myweb.Dispose();

  or difff. way of disposing for it by having using( )

/

   3. Similar to first.. SPSite mySite = SPContext.Current.Site;
                         SPWeb myweb = SPContext.Current.Web;

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

Спасибо

Ответы [ 4 ]

3 голосов
/ 23 января 2010

Вы должны сделать что-то вроде этого:

using(SPSite oSPsite = new SPSite("http://server"))
{
    using(SPWeb oSPWeb = oSPSite.OpenWeb())
    {
        // do stuff
    }
} 

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

РЕДАКТИРОВАТЬ: Да, вы можете использовать Context (и это всегда так), но его не следует использовать в некоторых сценариях, как внутри SPSecurity.RunWithElevatedPrivileges. Итак, я рекомендую:

  • 1 метод для нормальной работы
  • 2 для RunWithElevatedPrivileges и
  • 3 не следует использовать, так как , вероятно, испортит ваш запрос в случае утилизации.
1 голос
/ 25 января 2010

Нет лучшего способа, это зависит от того, что вы делаете. Если вы пишете код, в котором вы знаете, что у вас есть доступ к текущему / неявному контексту, такому как веб-часть, вариант № 1 предпочтительнее. Эта «копилка» в текущем контексте быстрее и экономит ресурсы. Пост Рубенса Фариаса предлагает некоторые дополнительные детали относительно ограничений.

Иногда у вас нет текущего / неявного контекста, такого как утилита командной строки. Иногда вы хотите получить доступ к объектам вне текущего контекста, например, в другом веб-приложении. В этих случаях у вас остается опция # 2, которая раскручивает свой собственный контекст.

Я склонен рассматривать вариант № 3 как избыточную и менее выразительную версию варианта № 1. Кто-то может предложить убедительные аргументы в пользу его использования, но я не сталкивался с этим.

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

1 голос
/ 24 января 2010

По сути, создание нового SPSite объекта "дорого" с точки зрения требуемой памяти. Вот почему вы должны Dispose(), когда это возможно, освобождать ресурсы, которые вы взяли.

Таким образом, всякий раз, когда такой метод доступен, вы должны вызывать методы, которые используют «синглтоны», встроенные в SharePoint. Например, в третьем примере вы звоните SPContext.Current.Web. Внутренне (вы можете видеть это, если загружаете код в Reflector), он хранит ссылку на объект SPWeb и возвращает вам один и тот же объект каждый раз, когда вы вызываете его. Это означает, что различные веб-элементы управления на одной странице используют один объект SPSite и один объект SPWeb. Ваш второй пример, однако, создает новый объект SPSite, который стоит 2 МБ памяти (информация взята из статьи Роберта Лэмба ).

На мой взгляд, 1-й и 3-й метод эквивалентны. Один из методов вызывает другой изнутри (в настоящий момент у меня нет доступа к microsoft.sharepoint.dll, поэтому я не могу проверить).
Второй пример отличается.

0 голосов
/ 24 января 2010

Методы 1 и 3 эквивалентны. Фактически SPContext (метод 3) использует сам метод 1. Я предпочитаю использовать SPContext.Current, потому что он дает хорошую согласованность, когда вы также хотите использовать SPContect.Current.List и т. Д., Который недоступен в SPControl

Метод 2 предназначен для использования, когда вы не запускаете свой код на рассматриваемом сайте, поэтому, если вы создаете приложение для консоли / WPF или расширение для stsadm.

Если вам нужно работать с повышенными привилегиями, используйте вариант метода 2 с Guid и SPUserToken в качестве параметров

Подводя итог, я рекомендую: используйте метод 3, если можете, и метод 2, когда вам нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...