visual-studio - CosmosDB项目布局

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

寻求建议和引用。

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

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

我的问题是,使用 Visual Studio,布局我的项目的最佳方式是什么,这样它就不会在餐巾纸和祈祷上完成?

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

谢谢!

最佳答案

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

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

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项目布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791171/

相关文章:

visual-studio - Qt - 使用 Visual Studio 构建的 exe 中的资源总是丢失

node.js - 如何为 Azure 上的 Node.js Api 应用程序启用 BLOB 日志记录?

asp.net-mvc - 我真的需要 2 个 SSL 认证才能将裸域重定向到 www 吗?

azure - 应用程序网关将 URL 路由到自定义端口

C++编程帮助

c# - 为什么 Visual Studio Debugger 在显示中删除\n?

windows - 如何将 key 重复率提高到操作系统的限制之外?

java - 如何使用 Java 在 Azure 服务总线中创建队列?

用于容器网络 VNET 的 Azure Web 应用程序

c# - 设置 Azure Web App 以接受客户端证书