Могу ли я заменить Document DB Generi c Repository на Cosmos DB SDK 3.0? - PullRequest
0 голосов
/ 27 мая 2020

Я создал общий репозиторий c для операций CRUD (создание, чтение, обновление и удаление) с помощью сборки Document DB. Я хочу заменить это на Cosmos DB SDK 3.0 SQL API.

Вот мой репозиторий cosmos db generi c:

 public class CosmosDBRepository<T> : ICosmosDBRepository<T> where T : class
    {
        private readonly DocumentClient _client;

        private readonly string DatabaseId = "FleetHub";
        public static string CollectionId = GetAttributeCosmoDbCollection<T>(typeof(T));
        public CosmosDBRepository()
        {
            var endpoint = CloudConfigurationManager.GetSetting("CosmoDbEndpoint");
            var authkey = CloudConfigurationManager.GetSetting("CosmoDbAuthKey");
            try
            {
                if (endpoint == null || authkey == null)
                {
                    throw new ArgumentNullException("CosmoDbEndpoint or CosmoDbAuthKey could not be found in the config file, check your settings.");
                }

                if (_client == null)
                {
                    _client = new DocumentClient(new Uri(endpoint), authkey, connectionPolicy: new ConnectionPolicy { EnableEndpointDiscovery = false });
                }

                CreateDatabaseIfNotExistsAsync().Wait();
                CreateCollectionIfNotExistsAsync().Wait();
            }
            catch (Exception e)
            {

            }
        }

        public async Task<T> GetItemAsync<T>(string id, string partitionkey) where T : class
        {
            try
            {

                Document document = await _client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), new RequestOptions { PartitionKey = new PartitionKey(partitionkey) });
                return (T)(dynamic)document;
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    return null;
                }
                else
                {
                    throw;
                }
            }
        }

        public async Task<Document> CreateItemAsync<T>(T item) where T : class
        {
            return await _client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), item);
        }
        public async Task<IEnumerable<T>> GetItemsAsync<T>(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderByDesc, int takeCount = -1)
            where T : class
        {
            var criteria = _client.CreateDocumentQuery<T>(
                        UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), new FeedOptions { EnableCrossPartitionQuery = true })
                    .Where(predicate)
                    .OrderByDescending(orderByDesc)
                    .AsDocumentQuery();

            IDocumentQuery<T> query = criteria;

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                if (takeCount > -1 && results.Count >= takeCount)
                {
                    break;
                }
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }

        public async Task<Document> UpdateItemAsync<T>(string id, T item) where T : class
        {
            return await _client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item);
        }
        private async Task CreateDatabaseIfNotExistsAsync()
        {
            try
            {
                await _client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(DatabaseId));
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    await _client.CreateDatabaseAsync(new Database { Id = DatabaseId });
                }
                else
                {
                    throw;
                }
            }
        }
        private async Task CreateCollectionIfNotExistsAsync()
        {
            try
            {
                await _client.ReadDocumentCollectionAsync(
                            UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId));
            }
            catch (DocumentClientException e)
            {

            }
        }

        private string GetPartitionKeyAttributeCosmoDbCollection(Type t)
        {
            // Get instance of the attribute.
            CosmoDBCollection attribute =
                (CosmoDBCollection)Attribute.GetCustomAttribute(t, typeof(CosmoDBCollection));

            if (attribute == null)
            {
                throw new Exception("The attribute CosmoDbCollection was not found.");
            }
            return attribute.PartitionKey;
        }
        private static string GetAttributeCosmoDbCollection<T>(Type t) where T : class
        {
            CosmoDBCollection attribute =
                (CosmoDBCollection)Attribute.GetCustomAttribute(t, typeof(CosmoDBCollection));
            return attribute.Name;
        }
    }

Могу ли я создать общий репозиторий c с Пакет SDK для Cosmos DB 3.0 SQL? Или мне нужно использовать сборку Document DB только для создания общего репозитория c. Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...