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

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

    public interface ICardLifeCycleEx
    {
        Guid CardTypeId { get; } (1)
        Guid Create(SessionContext sessionContext, CardCreateLifeCycleOptions options); (2)
        bool Validate(SessionContext sessionContext, CardValidateLifeCycleOptions options, out List<ValidationResult> validationResults); (3)
        void OnSave(SessionContext sessionContext, CardSaveLifeCycleOptions options); (4)
        bool CanDelete(SessionContext sessionContext, CardDeleteLifeCycleOptions options, out string message); (5)
        void OnDelete(SessionContext sessionContext, CardDeleteLifeCycleOptions options); (6)
        string GetDigest(SessionContext sessionContext, CardDigestLifeCycleOptions options); (7)
    }
1 Идентификатор типа карточек.
2 Create — Вызывается при получении разметки создания карточки.
3 Validate — Вызывается перед сохранением изменений карточки в БД с возможностью прервать сохранение.
4 OnSave — Вызывается при сохранении изменений карточки. Позволяет добавить дополнительную логику в сохранение карточки, но без возможности прервать сохранение.
5 CanDelete — Вызывается перед удалением карточки. Позволяет прервать удаление.
6 OnDelete — Вызывается при удалении карточки. Позволяет добавить дополнительную логику в удаление карточки, но без возможности прервать удаление.
7 GetDigest — Вызывается при получении дайджеста карточки при её сохранении. Позволяет добавить собственную логику формирования дайджеста. Метод GetDigest используется, только когда способ формирования дайджеста не настроен в Docsvision и карточка сохраняется из пользовательского интерфейса (при нажатии кнопки Сохранить, сохранении по месту или скриптом).

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

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

using System;
using DocsVision.BackOffice.ObjectModel.Services;
using DocsVision.BackOffice.ObjectModel;
using DocsVision.Platform.WebClient;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle;
using DocsVision.WebClientLibrary.ObjectModel.Services.EntityLifeCycle.Options;
using DocsVision.BackOffice.CardLib.CardDefs;


internal class DocumentCardLifeCycle : BaseCardLifeCycleEx
{
    public override Guid CardTypeId => CardDocument.ID;

    public override Guid Create(SessionContext sessionContext, CardCreateLifeCycleOptions options)
    {
        if (!options.CardKindId.HasValue)
            throw new ArgumentNullException(nameof(options.CardKindId));

        var objectContext = sessionContext.ObjectContext;
        var kindsCardKind = objectContext.GetObject<KindsCardKind>(options.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 void OnSave(SessionContext sessionContext, CardSaveLifeCycleOptions options)
    {
        base.OnSave(sessionContext, options);
        var objectContext = sessionContext.ObjectContext;
        var document = objectContext.GetObject<Document>(options.CardId);
        document.MainInfo.Name = "Принудительно установленное наименование документа";

        objectContext.AcceptChanges();
    }
}

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

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

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

public override void InitializeServiceCollection(IServiceCollection services)
{
    services.AddTransient<ICardLifeCycleEx, DocumentCardLifeCycle>();
}

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