Перейти к содержанию

Создание копии карточки на сервере

Создание копии карточки на сервере

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

Создание копии карточки - это создание “шаблона” из экспортированной карточки с последующим созданием карточки по этому шаблону (без фактического сохранения шаблона) и сохранением созданной по шаблону карточки в базу.

Следующий пример подразумевает код в расширении CardStoreExtension, в методе BeforeCommitTransaction:

// получаем через конструктор расширения: // [Dependency(CardRepositoryNames.ExtendedWithoutTransaction)] ICardManager cardManager // [Dependency(CardRepositoryNames.ExtendedWithoutTransaction)] ICardRepository cardRepositoryWithoutTransaction

var exportRequest = new CardGetRequest { CardID = args.CardID, CardTypeID = args.CardTypeID, CardTypeName = args.CardTypeName, CompressionMode = CardCompressionMode.Full, RestrictionFlags = CardGetRestrictionValues.ExportForTemplate, Info = args.Info, };

var exportResponse = await this.cardManager.ExportAsync(exportRequest, cancellationToken: context.CancellationToken); context.ValidationResult.Add(exportResponse.ValidationResult);

if (!exportResponse.ValidationResult.IsSuccessful()) { return; }

var sourceCard = exportResponse.Card; var exportedCard = sourceCard.Clone(); exportedCard.TryGetFiles()?.Clear();

CardNewResponse newResponse = await CardHelper.CreateFromExportedCardAsync( exportedCard, sourceCard.TryGetFiles(), sourceCard.ID, sourceCard.TypeID, this.cardManager, creatingCopy: true, cancellationToken: context.CancellationToken);

context.ValidationResult.Add(newResponse.ValidationResult);

if (!newResponse.ValidationResult.IsSuccessful()) { return; }

newResponse.Card.ID = Guid.NewGuid();

var storeRequest = new CardStoreRequest { Card = newResponse.Card }; var storeResponse = await this.cardRepositoryWithoutTransaction.StoreAsync(storeRequest, context.CancellationToken);

context.ValidationResult.Add(storeResponse.ValidationResult);

Также напишите класс регистратора, позволяющий использовать ICardManager с расширениями, но без транзакции:

[Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterUnity() { this.UnityContainer .RegisterType<ICardManager, CardManager>( CardRepositoryNames.ExtendedWithoutTransaction, new ContainerControlledLifetimeManager(), new InjectionConstructor( typeof(ISession), typeof(ICardMetadata), typeof(ICardRepairManager), typeof(ICardRepository), typeof(Func<IGuidReplacer>), typeof(ICardStreamClientRepository), new ResolvedParameter<ICardStreamServerRepository>(CardRepositoryNames.ExtendedWithoutTransaction), typeof(ICardNewStrategy))); } }

Back to top