コード例 #1
0
        public async Task <TResult> ExecuteUpdateAsync <TEntity, TResult>(MemberInfo memberInfo,
                                                                          IAzureStorageTableEntity <TEntity> updatedEntity, IAzureStorageTableEntity <TEntity> existingEntity,
                                                                          AzureTableDriverDynamic repository,
                                                                          Func <Func <Task>, TResult> onSuccessWithRollback,
                                                                          Func <TResult> onFailure)
        {
            var newValue      = memberInfo.GetValue(updatedEntity.Entity);
            var existingValue = memberInfo.GetValue(updatedEntity.Entity);

            if (newValue.GetType().IsAssignableTo(typeof(System.Delegate)))
            {
                var dele     = (Delegate)newValue;
                var deleType = dele.Target.GetType();
                if (deleType.DeclaringType.GUID == typeof(StorageSubtableAttribute).GUID)
                {
                    return(onSuccessWithRollback(() => true.AsTask()));
                }
            }

            var rowKeyRef       = updatedEntity.RowKey;
            var partitionKeyRef = updatedEntity.PartitionKey;

            var memberType  = typeof(TEntity);
            var taskValue   = newValue.ExecuteFunction(out Type taskType);
            var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave);

            var rawValues = Serialize(resultValue, typeToSave);

            ITableEntity subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues);
            var          tableName      = StorageLookupAttribute.GetMemberTableName(memberInfo);
            var          tableRef       = repository.TableClient.GetTableReference(tableName);

            return(await repository.InsertOrReplaceAsync(subtableEntity, new E5CloudTable(tableRef),
                                                         (created, tr) => onSuccessWithRollback(() => 1.AsTask())));
        }
コード例 #2
0
        public async Task <TResult> ExecuteCreateAsync <TEntity, TResult>(MemberInfo memberInfo,
                                                                          string rowKeyRef, string partitionKeyRef, TEntity value, IDictionary <string, EntityProperty> dictionary,
                                                                          AzureTableDriverDynamic repository,
                                                                          Func <Func <Task>, TResult> onSuccessWithRollback,
                                                                          Func <TResult> onFailure)
        {
            var memberType  = typeof(TEntity);
            var taskValue   = value.ExecuteFunction(out Type taskType);
            var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave);

            var rawValues = Serialize(resultValue, typeToSave);

            var subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues);
            var tableName      = StorageLookupAttribute.GetMemberTableName(memberInfo);
            var tableRef       = repository.TableClient.GetTableReference(tableName);

            return(await repository.CreateAsync(subtableEntity, new E5CloudTable(tableRef),
                                                (discard, discard2) => onSuccessWithRollback(() => 1.AsTask()),
                                                onAlreadyExists : () => onFailure()));
        }
コード例 #3
0
        public static Func <Task <T> > GetLookupDelegate <T>(MemberInfo memberInfo,
                                                             string rowKey, string partitionKey, IProvideEntity entityProvider)
        {
            var repository = AzureTableDriverDynamic.FromSettings();
            var tableName  = StorageLookupAttribute.GetMemberTableName(memberInfo);
            // var tableRef = repository.TableClient.GetTableReference(tableName);
            Func <Task <T> > lookupDelegate = () =>
                                              repository.FindByIdAsync <T, T>(rowKey, partitionKey,
                                                                              onFound: (resource, tr) => resource,
                                                                              onNotFound: () =>
            {
                if (typeof(T).IsArray)
                {
                    return((T)typeof(T)
                           .GetElementType()
                           .ConstructEmptyArray());
                }
                return(default(T));
            },
                                                                              tableName: tableName,
                                                                              entityProvider: entityProvider);

            return(lookupDelegate);
        }