处理开发时间web.config冲突

时间:2018-10-24 20:45:13

标签: asp.net git visual-studio-2017 web-config

我正在寻找一种方法来应对这一挑战:我们是一个地理位置分散的开发团队,使用ASP.NET Web API和Angular来构建Web应用程序。

引起悲伤的是,并非所有团队成员都为开发工作使用相同的数据库设置。是的,我知道-我可以使用web.config转换为测试,暂存和生产设置适当的连接字符串(而且我已经在做)-但这不是我要说的。

由于目前无法控制的原因,我们有

  • 一些使用server=(local);database=OurDB作为连接字符串的本地SQL Server实例上的开发人员
  • 其他开发人员在他们的位置使用中央开发人员SQL Server,并且使用类似server=someserver.mycorp.com;database=OurDB
  • 和一些具有其他设置的特殊情况

现在,每次有人对Git存储库进行更改,并且碰巧也在web.config中进行了更改时,他的连接字符串都将提交给存储库。因此,当我继续执行最新提交时,该本地数据库服务器上的设置将被其他人的设置覆盖。

我正在寻找一种解决此问题的方法-我希望自己能够

  • 进入Git提取过程,并在每次提取某物时自动将web.config连接字符串更新为我的本地需求

  • 基于某种方式引用连接字符串(或外部配置文件)我当前登录的用户名或类似的名称

但是我似乎找不到任何方法。我想知道我是否需要构建VS扩展来处理此问题-为此有任何入门吗?有没有人做过这样的事情并且可以分享他的代码? (或者在Github上发布)

1 个答案:

答案 0 :(得分:1)

ASP.NET中使用的web.config配置系统不够灵活,无法支持您描述的更高级的方案。那么,为什么要使用它呢?您可以将配置存储在资源库中的文件中,每个开发人员一个。或者可以将它们存储在存储库之外,或者以其他方式忽略。

真正的诀窍是,大多数较旧的应用程序没有单个根来检索配置,因此您必须重构应用程序以利用灵活的配置系统。对于您的暂存/生产环境,您可能仍想使用web.config中的配置。以下代码可以为您提供一种结构化方法的基本概念:

public class MyApplicationConfiguration
{
    public string MainConnectionString { get; set; }
}

public class ConfigurationRetriever
{
    public MyApplicationConfiguration GetConfiguration()
    {
        // You might look for the absence or presence of an environment variable to determine this
        bool isLocalDevelopment = IsApplicationLocalDevelopment();

        var config = new MyApplicationConfiguration();

        if(isLocalDevelopment)
        {
            config.MainConnectionString = Environment.GetEnvironmentVariable("MyApplication_MainConnectionString");

            //or get it from a JSON file or XML file or config database
        }
        else
        {
            config.MainConnectionString = ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString;
        }
    }
}

您可能不需要重构自己的配置构建逻辑,而是可以重构应用程序以利用Microsoft.Extensions.Configuration。它不仅适用于.NET Core。适用于.NET Standard。因此,即使在旧版ASP.NET应用程序中也可以使用它。为了阅读web.config,您可以使用Microsoft.Extensions.Configuration.Xml。或者,您可以编写自己的适配器,将值从ConfigurationManager中拉出。我做了一个基本测试,并且按预期进行。