SPMeta2 - практика и небольшие хаки - LookupField

Практически все наши проекты по разработке и внедрению решений на платформе Microsoft SharePoint 2013 начиная с 2015 года реализованы с применением фреймворка управляемой провизии SPMeta2 (более подробно можно почитать тут).

Однако, в процессе работы с фреймворком, иногда могут возникать трудности не столько связанные с самим решением, сколько с архитектурой SharePoint. Техническая поддержка SPMeta2 быстро устраняет замечания, вносит изменения и добавляет новым функционалом, если в этом функционале есть спрос. Однако, не всегда имеет смысл требовать от разработчиков изменений. Все-таки провизия управляемая с использованием программного кода и в некоторых случаях наилучшим способом будет создание собственных доработок и функций.

Мы будем делиться нашим опытом в серии постов, посвященных данному фрейморку

Одна из таких проблем - это провизия полей Lookup (лукап) и Depended Lookup (связанный лукап). Провизия поля Lookup описана тут

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

К сожалению, данный подход не всегда работает, помимо того, что он становится тяжело читаемым и управляемым, в связи с тем, что разрослись модели. Точно установить ситуации, когда это не работает не удается, поведение непрозрачное. Чаще всего дает сбои в нестандартных провизиях, таких как на сайт-коллекциях по не корневому пути (например, http://sharepoint/sites/newsite) и при связи лукапа со списком на вебе, отличном от корневого. Все эти проблемы связаны с объектной моделью самого SharePoint. Но, написав всего один раз небольшой метод расширение, данных проблем не знаем и используем его во всех проектах при провизии Lookup.

Основная задумка:

  • Сформировать стандартную модель для SPMeta2 с описанием пустого лукапа и списка, на который лукап далее должен ссылаться
  • Создается одна модель для провизии поля и списка
  • После провизии, когда мы знаем на каком узле был размещен список, мы можем его получить по описанию в моделе и обновить XML поля, указав WebId и List (идентификатор)

Полностью исходные коды доступны на GitHub одним классом для удобства восприятия примера


Опубликовано: 17.08.2016
Автор: Сергей Снитко