我正在寻找一种方法来应对这一挑战:我们是一个地理位置分散的开发团队,使用ASP.NET Web API和Angular来构建Web应用程序。
引起悲伤的是,并非所有团队成员都为开发工作使用相同的数据库设置。是的,我知道-我可以使用web.config
转换为测试,暂存和生产设置适当的连接字符串(而且我已经在做)-但这不是我要说的。
由于目前无法控制的原因,我们有
server=(local);database=OurDB
作为连接字符串的本地SQL Server实例上的开发人员server=someserver.mycorp.com;database=OurDB
现在,每次有人对Git存储库进行更改,并且碰巧也在web.config中进行了更改时,他的连接字符串都将提交给存储库。因此,当我继续执行最新提交时,该本地数据库服务器上的设置将被其他人的设置覆盖。
我正在寻找一种解决此问题的方法-我希望自己能够
进入Git提取过程,并在每次提取某物时自动将web.config
连接字符串更新为我的本地需求
基于某种方式引用连接字符串(或外部配置文件)我当前登录的用户名或类似的名称
但是我似乎找不到任何方法。我想知道我是否需要构建VS扩展来处理此问题-为此有任何入门吗?有没有人做过这样的事情并且可以分享他的代码? (或者在Github上发布)
答案 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中拉出。我做了一个基本测试,并且按预期进行。