public static async Task <IComposedObject <T> > LookupOrRetrieveAsync <T>( DbRef reference, [NotNull] ICacheClient redis, [NotNull] Func <DbRef, CancellationToken, Task <T> > retrieveFunction, CancellationToken cancellationToken) where T : ObjectBase { if (reference.Equals(DbRef.Ambiguous) || reference.Equals(DbRef.FailedMatch) || reference.Equals(DbRef.Nothing)) { return(null); } if (redis == null) { throw new ArgumentNullException(nameof(redis)); } if (retrieveFunction == null) { throw new ArgumentNullException(nameof(retrieveFunction)); } if (reference.Equals(DbRef.Nothing)) { return(null); } if (Cache.Contains(reference)) { return((IComposedObject <T>)Cache.Get(reference)); } var obj = await retrieveFunction.Invoke(reference, cancellationToken); if (obj == null) { return(null); } var composition = await ComposedObject <T> .CreateAsync(redis, obj, cancellationToken); if (composition.Item1) { // The composition was perfect! No unresolved references, so cache it as-is. Cache.Add(reference, composition.Item2, Policy); } return(composition.Item2); }
public static async Task <IComposedObject <T> > UpdateAsync <T>( DbRef reference, [NotNull] ICacheClient redis, [NotNull] T updatedDataObject, CancellationToken cancellationToken) where T : ObjectBase { if (Cache.Contains(reference)) { Cache.Remove(reference); } var composition = await ComposedObject <T> .CreateAsync(redis, updatedDataObject, cancellationToken); if (composition.Item1) { // The composition was perfect! No unresolved references, so cache it as-is. Cache.Add(reference, composition.Item2, Policy); } return(composition.Item2); }