protected async Task DeleteItemIfAsync(IMessage message, Func <T, bool> predicate) { async Task DoAsync() { var lockId = GetLockId(message); await LockProvider.TryUsingAsync(lockId, async token => { var item = await LoadItemAsync(message).ConfigureAwait(false); if (item.Entity == null) { return; } if (!item.IsNew) { if (predicate(item.Entity)) { await DeleteAsync(item.Id, message, CreateIdentifierItem).ConfigureAwait(false); } } }, cancellationToken : CancellationToken.None).ConfigureAwait(false); } await LockProvider.TryUsingAsync(GetCacheLockId(), async() => await DoAsync().ConfigureAwait(false), timeUntilExpires : null, cancellationToken : CancellationToken.None).ConfigureAwait(false); }
protected async Task LoadAndSaveOnlyExistingAsync(IMessage message, Action <T> setValues = null) { var lockId = GetLockId(message); await LockProvider.TryUsingAsync(lockId, async token => { var item = await LoadItemAsync(message).ConfigureAwait(false); var entity = item.Entity; if (item.IsNew) { Logger.LogTrace("Skipping new Item"); } else { if (entity == null) { Logger.LogTrace("No Valid Entity Loaded"); } else { setValues?.Invoke(entity); // await SaveItemAsync(item, message, state); await SaveItemAsync(item, message).ConfigureAwait(false); } } }, cancellationToken : CancellationToken.None).ConfigureAwait(false); }
private string GetLockId(IMessage evnt) { var lockId = $"{EntityTypeKey}-{CreateLockId(evnt)}"; if (string.IsNullOrEmpty(lockId)) { lockId = Guid.NewGuid().ToString(); } return(lockId); }
private async Task SaveItemAsync(EntityDescriptor <T> item, IMessage domainEvent) { async Task DoAsync() { if (Context.IsLiveProcessing) { await SaveAsync(item, domainEvent, CreateIdentifierItem(item.Entity)).ConfigureAwait(false); } else { await SaveAsync(item, domainEvent, null).ConfigureAwait(false); } await Cache.RemoveByPrefixAsync(EntityTypeKey).ConfigureAwait(false); } await LockProvider.TryUsingAsync(GetCacheLockId(), async() => await DoAsync().ConfigureAwait(false), timeUntilExpires : null, cancellationToken : CancellationToken.None).ConfigureAwait(false); }
protected async Task DeleteItemAsync(IMessage message) { async Task DoAsync() { var item = await LoadItemAsync(message).ConfigureAwait(false); if (item.Entity == null) { return; } if (!item.IsNew) { await base.DeleteAsync(item.Id, message, CreateIdentifierItem).ConfigureAwait(false); //,state: state); } } await LockProvider.TryUsingAsync(GetCacheLockId(), async() => await DoAsync().ConfigureAwait(false), timeUntilExpires : null, cancellationToken : CancellationToken.None).ConfigureAwait(false); }
protected abstract Task <EntityDescriptor <T> > LoadItemAsync(IMessage message);
protected abstract string CreateLockId(IMessage message);