Создание копии карточки на сервере
Создание копии карточки на сервере¶
Пусть по условию задачи требуется в пределах транзакции на сохранение карточки (например, при завершении задания или нажатии на кнопку) создать копию этой же карточки.
Создание копии карточки - это создание “шаблона” из экспортированной карточки с последующим созданием карточки по этому шаблону (без фактического сохранения шаблона) и сохранением созданной по шаблону карточки в базу.
Следующий пример подразумевает код в расширении 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)));
}
}