当前位置: 首页 > 知识库问答 >
问题:

我可以用Cosmos DB SDK 3.0替换Document DB通用存储库吗?

苏墨竹
2023-03-14

我已经创建了通用存储库,用于使用文档数据库程序集执行CRUD(创建、读取、更新和删除)操作。我想用Cosmos DB SDK 3.0 SQL API替换它。

以下是我的宇宙数据库通用存储库:

 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;
        }
    }

我可以用Cosmos DB SDK 3.0 SQL创建通用存储库吗?或者我只需要使用Document DB assembly来创建通用存储库。有什么想法吗?

共有1个答案

鲜于高明
2023-03-14

是的,你可以。请参考这些文件:

快速入门:生成 .NET 控制台应用以管理 Azure Cosmos DB SQL API 资源

Azure宇宙数据库。NET V3 SDK(Microsoft.Azure.Cosmos)SQL API示例

 类似资料:
  • 问题内容: 我正在使用 EclipseLink的JAXB实现的一些非标准扩展,并且要启用该实现,必须使用jaxb.properties对其进行配置。效果很好。 但是,由于生成错误,属性文件未包含在正确的位置,从而导致使用默认的JAXB,该文件没有任何错误,只是继续解析XML文件,忽略了非标准扩展名,给我留下了一个非工作bean。 为了使它更加健壮,我想摆脱属性文件,并在代码中指定上下文配置。由于它

  • 我开发了几个电子商务网站,最近我注意到了axonframework。我正在考虑如何用AxonFramework实现一个新的电子商务站点。 null 提前谢了。

  • 我必须用一个特定的名称(我使用spring和Jpa)来命名扩展CrudRepository的接口,即。 所以在本例中,我有一个名为UserRepository的实体 我尝试了注释 但这行不通...

  • 我见过存储库模式的各种用法。我倾向于一种我很少看到的模式,我想知道这是否有充分的理由。 例子: 利益 构造函数将是内部的,只能通过工厂模式访问,所以我不担心这里的复杂性。 IPerson 强制实现 Save() 方法,但教师不需要知道它是如何持久化的 工作原理类似于实体框架代理对象 我可以在 Iperson 对象上调用 Save(),而无需知道它是老师 应用- 欺骗 > 业务对象不再是普通的旧C#

  • 问题内容: 我在暑期研究中从事内核工作。我们希望在特定的RTT计算中对TCP进行修改。我想做的是将tcp_input.c中的功能之一的分辨率替换为由动态加载的内核模块提供的功能。我认为这将改善我们开发和分发修改的速度。 我感兴趣的函数被声明为静态的,但是我用非静态函数重新编译了内核,并由EXPORT_SYMBOL导出。这意味着该功能现在可供内核的其他模块/部分访问。我已经通过“ cat / pro

  • 我正在尝试用Springdoc替换手动维护的swagger文件。目前,我们使用ReDoc来呈现文件,因为它们支持。 是否有一种简单的方法可以用替换/取代嵌入式?