protected internal DocumentRepository(CloudStorageAccount storageAccount, string tableName, Func <T, string> partitionKey, Func <T, string> rowKey, IDocumentSerializer serializer)
        {
            this.storageAccount = storageAccount;
            TableName           = tableName ?? TableRepository.GetDefaultTableName <T>();

            this.partitionKey = partitionKey ?? PartitionKeyAttribute.CreateCompiledAccessor <T>();
            this.rowKey       = rowKey ?? RowKeyAttribute.CreateCompiledAccessor <T>();

            stringSerializer = serializer as IStringDocumentSerializer;
            binarySerializer = serializer as IBinaryDocumentSerializer;

            if (stringSerializer == null && binarySerializer == null)
            {
                throw new ArgumentException($"A valid serializer implementing either {nameof(IBinaryDocumentSerializer)} or {nameof(IStringDocumentSerializer)} is required.", nameof(serializer));
            }

            // Use the right strategy depending on the provided serializer.
            if (stringSerializer != null)
            {
                enumerate = EnumerateStringAsync;
                get       = GetStringAsync;
                put       = PutStringAsync;
            }
            else
            {
                enumerate = EnumerateBinaryAsync;
                get       = GetBinaryAsync;
                put       = PutBinaryAsync;
            }

            table = GetTableAsync(TableName);
        }
        public static IDocumentRepository <T> Create <T>(
            CloudStorageAccount storageAccount,
            string?tableName = default,
            Func <T, string>?partitionKey  = default,
            Func <T, string>?rowKey        = default,
            IDocumentSerializer?serializer = default) where T : class
        {
            tableName ??= TableRepository.GetDefaultTableName <T>();
            partitionKey ??= PartitionKeyAttribute.CreateCompiledAccessor <T>();
            rowKey ??= RowKeyAttribute.CreateCompiledAccessor <T>();
            serializer ??= DocumentSerializer.Default;

            return(new DocumentRepository <T>(storageAccount, tableName, partitionKey, rowKey, serializer));
        }