Реализация методов для работы с карточками из разметок

Программисту предоставляется возможность добавить новую функциональность в механизмы создания и работы с карточками из разметок. Данная возможность реализуется с помощью специального класса с интерфейсом ICardLifeCycle. Интерфейс ICardLifeCycle предоставляет методы, которые вызываются на различных этапах работы с карточкой:

public interface ICardLifeCycle
{
    Guid Create(SessionContext sessionContext, Guid? cardKindId, Guid? parentCardId); (1)
    Guid CreateFromTemplate(SessionContext sessionContext, Guid templateId, Guid? parentCardId); (2)
    string GetDigest(SessionContext sessionContext, Guid cardId); (3)
    bool Validate(SessionContext sessionContext, Guid cardId, out List<ValidationResult> validationResults); (4)
    void OnSave(SessionContext sessionContext, Guid cardId); (5)
    bool CanDelete(SessionContext sessionContext, Guid cardId, out string message); (6)
    void OnDelete(SessionContext sessionContext, Guid cardId); (7)
}
1 Create — Вызывается при получении разметки создания карточки.
2 CreateFromTemplate — Вызывается при получении разметки создания карточки по шаблону.
3 Validate — Вызывается перед сохранением изменений карточки в БД с возможностью прервать сохранение.
4 GetDigest — Вызывается при получении дайджеста карточки при её сохранении. Позволяет добавить собственную логику формирования дайджеста. Метод GetDigest используется, только когда способ формирования дайджеста не настроен в Docsvision и карточка сохраняется из пользовательского интерфейса (при нажатии кнопки Сохранить, сохранении по месту или скриптом).
5 OnSave — Вызывается при сохранении изменений карточки. Позволяет добавить дополнительную логику в сохранение карточки, но без возможности прервать сохранение.
6 CanDelete — Вызывается перед удалением карточки. Позволяет прервать удаление.
7 OnDelete — Вызывается при удалении карточки. Позволяет добавить дополнительную логику в удаление карточки, но без возможности прервать удаление.

Указанные методы используются исключительно при выполнении стандартных операций со строками из разметок или с использованием JS WebAPI разметок. В других случаях методы интерфейса ICardLifeCycle не вызываются и не влияют на работу сервера Web-клиента с карточками.

Следующий код демонстрирует пример реализации класса, в котором определены собственные функции создания и сохранения карточки.

public class DocumentCardLifeCycle : BaseCardLifeCycle
{
    public override Guid Create(SessionContext sessionContext, Guid? cardKindId, Guid? parentCardId)
    {
        if (!cardKindId.HasValue)
            throw new ArgumentNullException(nameof(cardKindId));

        var objectContext = sessionContext.ObjectContext;
        var kindsCardKind = objectContext.GetObject<KindsCardKind>(cardKindId);
        var documentService = objectContext.GetService<IDocumentService>();
        var document = documentService.CreateDocument(null, kindsCardKind);
        document.Description = document.SystemInfo.CardKind.Name;
        document.MainInfo.Name = "Наименование документа";

        objectContext.AcceptChanges();
        return document.GetObjectId();
    }

    public override Guid CreateFromTemplate(SessionContext sessionContext, Guid templateId, Guid? parentCardId)
    {
        var objectContext = sessionContext.ObjectContext;
        var documentService = objectContext.GetService<IDocumentService>();
        var document = documentService.CreateDocumentFromTemplate(templateId);

        objectContext.AcceptChanges();
        return document.GetObjectId();
    }

    public override void Save(SessionContext sessionContext, Guid cardId)
    {
        base.Save(sessionContext, cardId);
        var objectContext = sessionContext.ObjectContext;
        var document = objectContext.GetObject<Docsvision.BackOffice.ObjectModel.Document>(cardId);
        document.MainInfo.Name = "Принудительно установленное наименование документа";

        objectContext.AcceptChanges();
    }
}

В приведенном коде класс DocumentCardLifeCycle наследуется от базовой реализации интерфейса ICardLifeCycle — класса BaseCardLifeCycle с абстрактными методами. Помимо класса BaseCardLifeCycle с базовой реализацией, API включает реализующий интерфейс ICardLifeCycle класс DefaultCardLifeCycle с реализацией по умолчанию методов Create и CreateFromTemplate.

Метод Create в приведенном выше коде создаёт новую карточку Документ с предустановленным названием (document.MainInfo.Name). Метод CreateFromTemplate создаёт карточку Документа по шаблону. Метод Save изменяет значение поля document.MainInfo.Name при сохранении карточки.

Тип с интерфейсом ICardLifeCycle нужно добавить в IoC-контейнер в ядре расширения:

public override void InitializeContainer(ContainerBuilder containerBuilder) {
    var cardTypeID = new Guid("B9F7BFD7-7429-455E-A3F1-94FFB569C794"); (1)
    containerBuilder.RegisterType<DocumentCardLifeCycle>().Keyed<ICardLifeCycle>(cardTypeID).SingleInstance();
}
1 Идентификатор типа карточек.

Серверное расширение должно быть опубликовано стандартным образом.