예제 #1
0
        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);
        }
예제 #2
0
        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);
        }