【问题标题】:CosmosDB Project LayoutCosmosDB 项目布局
【发布时间】:2018-04-18 15:31:17
【问题描述】:

寻求建议和参考。

使用 Visual Studio,我的解决方案中有一个 Azure Web Apps 项目。现在,我正在为 CosmosDB 编写存储过程。使用 CosmosDB 模拟器,我可以简单地将存储过程代码直接插入浏览器编辑器窗口。一切都很好,一切都很好。

我的 Web App 项目旁边还有一个 NodeJS 项目。这允许我将存储过程存储为文件。关联的控制台应用程序能够按预期连接和修改 CosmosDB 模拟器。

我的问题是,使用 Visual Studio 来布置我的项目的最佳方式是什么,而不是在餐巾纸和祈祷上完成?

我想知道我应该如何构建我的项目布局和资产以符合当前的“最佳实践”。你们有没有发现任何信息、文章或帖子专门讨论这个问题?我会手动对 CosmosDB 运行所有这些程序,还是有人设计了自动化程序?我希望能够首先针对模拟器测试这些存储过程,并且几乎没有源代码更改,更新暂存。

谢谢!

【问题讨论】:

    标签: visual-studio azure azure-web-app-service azure-cosmosdb


    【解决方案1】:

    我最近刚刚问过自己关于存储过程迁移的同样问题。我目前正在运行一个基本的Migrate 方法,该方法将从 js 文件中获取存储过程内容并替换/创建存储过程,它在启动时运行(在startup.cs中)

    以下代码的主要要点,您将需要创建非常基本的内部方法(欢迎使用 cmets):

    using System;
    using System.IO;
    using System.Threading.Tasks;
    using App.Data.Access;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Azure.Documents;
    
    namespace App.Data.StoredProcedures
    {
        public class Migrations : IMigrations
        {
            private readonly IHostingEnvironment _hostingEnvironment;
            private readonly IDocumentDbContext _documentDbContext;
    
            public Migrations(IHostingEnvironment hostingEnvironment,IDocumentDbContext documentDbContext)
            {
                _hostingEnvironment = hostingEnvironment;
                _documentDbContext = documentDbContext;
            }
    
            public async Task<bool> Migrate()
            {
                try
                {
                    await AddUpdateBulkDeleteStoredProcedure();
    
                    return true;
                }
                catch (Exception exception)
                {
                    throw new Exception("Error running CosmosDb stored procedure migrations,error" + exception.Message);
                }
            }
    
            public string GetStoredProcedureScript(string filename)
            {
                var script = Path.Combine(_hostingEnvironment.WebRootPath, "App_Data", "CosmosDbStoredProcedures", filename);
                return IO.File.ToString(script);
            }
    
            public async Task<bool> AddUpdateBulkDeleteStoredProcedure()
            {
                const string storedProcedureId = "BulkDeleteStoredProcedure";
    
                var function = GetStoredProcedureScript($"{storedProcedureId}.js");
    
                if (string.IsNullOrWhiteSpace(function))
                {
                    throw new Exception($"Error running DocumentDb Stored procedure migrations, {storedProcedureId} content is empty");
                }
    
                try
                {
                    await _documentDbContext.Client.ReplaceStoredProcedureAsync(_documentDbContext.GetStoredProcedureUri(storedProcedureId), new StoredProcedure {Id = storedProcedureId, Body = function});
                    return true;
                }
                catch
                {
                    // ignore
                }
    
                await _documentDbContext.Client.CreateStoredProcedureAsync(_documentDbContext.DocumentCollectionUri, new StoredProcedure {Id = storedProcedureId, Body = function});
    
                return true;
            }
        }
    }
    

    【讨论】:

    • 这是我最初的想法,从本地文件系统中读取函数。这与我多年前使用的方法相似。我不确定在此期间,Visual Studio 是否没有添加某种“发布”到 CosmosDB 功能...
    • 我还没有找到任何开箱即用的东西,但如果你找到了,请告诉它。
    • 代替任何其他建议,这似乎是目前的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2018-05-17
    相关资源
    最近更新 更多