10 фактов* о SharePoint, которые не помешали бы мне год назад.
1. Используй виртуальную машину.
Сразу бери/проси машину помощнее, тебе понадобится, как минимум процессор i3/i5 и 8 gb памяти, чтобы поднять виртуальную машину в которой и будет вестись вся разработка. Работая в виртуальной среде, ты сэкономишь себе кучу времени и нервов, т.к. в случае чего – всегда можно откатиться к предыдущему snapshot-у, а при старте нового проекта восстановить исходное состояние системы с чистым SharePoint всего за пару кликов. Ну а если разработка ведется сразу в двух ветках одного проекта (скажем, branch с фиксами для прошлого релиза и trunk с новой функциональностью), то без возможности переключаться между snapshot-ами просто никак. Выбор платформы остается за тобой, но я, лично, предпочитаю связку VMWare + Windows 2008 R2.
2. Выработай четкую политику накатывания обновлений.
С webpart-ами, формами и т.п. у тебя не должно возникнуть никаких проблем при накатывании новых изменений, т.к. при их re-deploy ты ничего не потеряешь, но вот с полями, типами, списками и рабочими процессами тебе придется помучиться. Постарайся четко определиться (а ещё лучше как-то автоматизировать) каким образом ты будешь накатывать изменения на production сервер. Я для себя выбрал следующую тактику: при внесении какого-либо изменения в схему списка или контентного типа тут же создается PowerShell скрипт, позволяющий накатить те же самые изменения на предыдущий релиз, развернутый у заказчика и на тестовом сервере. Скрипты упорядочиваются по задачам, к которым они привязаны и номерам версий. Feature Upgrade, конечно более естественный для SharePoint механизм накатывания изменений на схему, но у меня с ним возникала куча самых разных проблем.
3. Нет, от конетекста SharePoint тебе не отвязаться.
Поначалу я очень-очень старался скрыть от слоя бизнес-логики тот факт, что (о ужас!) она взаимодействует с SharePoint. Подсовывал всякие DTO и DataModel объекты, генерировал фасады и медиаторы, сервисы-провайдеры и репозитории. Но все это бесполезно, не тратьте впустую время – ты работаешь с SharePoint, так что изволь играть по его правилам. Передавай SPListItem-ы в сервисы уровня BLL, которые отвечают за назначения прав доступа, прокидывай SPWeb сквозь View в Presenter и далее в Model. Да – некрасиво, да – очень сложно тестировать. Но иначе ты просто рискуешь запутаться из какого контекста пришел тот или иной объект (страница/ресивер/таймер) и увязнуть в тонне фасадов, созданных на каждый случай. Улучшай читаемость, степень повторного использования кода внедряй модные паттерны и разделяй на слои, но делай это все в духе SharePoint.
4. Разделяй и властвуй.
Советую сразу выделять все, что связано с уровнем хранения данных (поля, типы, списки) в отдельные проекты. Это существенно упростит процесс deploy и отладки. Рабочие процессы, кстати, тоже по-хорошему надо выносить в отдельный пакет.
5. EventReciver-ы не так просты, как кажутся.
Если у тебя есть задача, которая решается при помощи EventReceiver-ов и это твоя первая встреча с ними – не торопись. Они только с виду кажутся простыми, а на практике с ними столько заморочек. Лучше сядь, прочитай главу про EventReceiver-ы в какой-нибудь умной книжке (мне, кстати, нравится Jorg Krause – SharePoint 2010 as a Development Platform (amazon)) и серию из двух статей в блоге gandjustas-а (часть 1, часть 2). А затем определить какой именно из Receiver -ов тебе нужен, и не спеша, вдумчиво приступай к реализации. Я в свое время потратил кучу времени и нервов, пытаясь с ходу реализовать сложный Receiver.
6. Использовать Linq To SharePoint не самая лучшая идея.
Я вот тоже очень обрадовался, когда узнал, что в SharePoint 2010 теперь есть настоящий Linq для работы со списками. Сразу же кинулся все на нем реализовывать и только потом понял, что зря я это сделал. Linq2SP предоставляет очень скудную функциональность по работе со списками. Если ты реализуешь что-то, действительно, серьезное, то почти наверняка придется плодить параллельную иерархию на основе объектной модели SharePoint (SPListItem, CAML и т.п.). А дублирование кода никогда ни к чему хорошему не приводило. Плюс, к тому же, ты его никак не контролируешь и из-за этого можно очень легко накосячить с производительностью. Но если все-таки хочется чего-то Linq-ушного, то бери на вооружение Camlex. Вещь неплохая, хорошо встраивается в существующие SharePoint проекты, да и к тому же он OpenSource.
7. Есть много плагинов и приложений, которые упрощают работу с SharePoint.
SharePoint Software Factory – сборник “рецептов” и полезных утилит для работы с SharePoint. Особенно советую обратить внимание на возможность копирования файлов напрямую в GAC/Hive, минуя deploy (неплохо экономит время) и на attach к процессам SharePoint(IIS, Timer) для отладки.
CKS – Development Tools Edition - почти тоже, что и Software Factory, но без рецептов.
ULS Viewer – утилита для работы с логами SharePoint. Он там пишет очень много всего интересного. В случае возникновения непонятной ошибки в первую очередь советую заглянуть именно туда.
SharePoint Manager 2010 – Невероятно полезная утилита. Позволяет посмотреть структуру сайтов SharePoint и получить схемы всего и вся. Много раз выручал меня.
U2U Caml Query Builder – Утилита для построения CAML запросов. Удобно, просто, наглядно.
SPDisposeCheck – Проверяет проекты на предмет утечки памяти. Запускай время от времени, а ещё лучше, интегрируй в свой Continuous Integration сервер.
8. PowerShell твой лучший друг.
Серьезно, не пренебрегай им. На PowerShell очень просто писать патчи для обновления схем и небольшие утилиты для автоматизации каких-либо действий. В качестве IDE я советую использовать PowerGUI.
9. Не забывай освобождать ресурсы.
Надеюсь, ты уже в курсе, что часть SharePoint реализовано с использованием COM, и что такие объекты как SPSite и SPWeb тянут за собой неуправляемые ресурсы, которые надо явно высвобождать через Dispose? Вот я когда-то не знал и очень удивлялся, когда через день активной работы SharePoint забирал себе всю память, и ни в какую не хотел ее отдавать назад. Так что следи за каждым созданием SPSite и SPWeb, прочитай эту статью на MSDN и время от времени запускай SPDisposeCheck (см. п.7).
10. SharePoint с налету не взять.
Когда мне предложили попробовать себя в роли SharePoint разработчика я подумал: “Хм, а почему бы и нет? Я вроде бы поднаторел в изучении новых платформ. IPhone и Flex пошли на “ура”. А SharePoint, это всего-навсего надстройка над ASP.NET. Легко!”. Как окажется позднее – я сильно ошибался, SharePoint с налету не взять. Будь сразу готов к тому, что у разработчиков SharePoint было свое мнение по поводу того, что логично, а что нет. Тебе придется потратить кучу времени, раскапывая тонны javascript-ов и xml-ек, чтобы разобраться, как добавить одну единственную кнопку, без которой заказчик не хочет принимать форму. Для меня SharePoint это один большой Challenge. Читай книжки, блоги, выискивай статьи на msdn, общайся на форумах и будь готов к сложностям. Впрочем, как раз из-за обилия этих сложностей нам хорошо платят и мы нужны всем.
Буду очень рад, если кто-то захочет дополнить этот список и поделиться своим опытом работы с SharePoint. Пишите, комментируйте!
* – хотя, корректнее, было бы сказать мыслей или знаний полученных в результате практической работы с SharePoint.