如何管理每个开发人员的配置设置


3

在一个.NET项目中,假设你有一个配置设置 - 比如连接字符串 - 存储在一个app.config文件中,这对你团队中的每个开发人员都是不同的(他们可能是使用本地SQL Server,特定服务器实例或使用远程服务器等)。

如何构建您的解决方案,以便每个开发人员都可以拥有自己的开发“首选项”(即未检入源代码管理),但提供了一个默认的连接字符串,并将其检入到源代码管理中(从而为源代码管理提供了正确的默认值构建过程或新开发者)。


编辑:@Jonathon建议的“file”方法可以以某种方式与connectionStrings节一起使用吗?

4

的AppSettings可以用本地文件覆盖:

<appSettings file="localoveride.config"/> 

这允许每个开发人员,以保持自己的本地设置。

至于连接字符串,在一个完美的世界上所有的开发者应该连接到测试数据库,而不是运行每个SQL服务器。

但是,我发现最好在源代码管理中保留一个名为Web.Config.Prd的文件,并将其用于构建部署。如果有人修改了web.config文件,他们也必须添加换到.PRD文件......有没有好的自动化有:(


0

我总是为我的配置文件制作模板。

作为一个例子,我使用NAnt来构建我的项目。我有一个名为local.properties.xml.template的文件。如果local.properties.xml不存在,我的NAnt构建将警告开发人员。该文件内将是工作站特定的设置。该模板将被检入到源代码控制中,但实际配置将不会。


0

我使用相当古老的设计,只是工作。

  • /_Test__app.config
  • /_Prod__app.config
  • /app.config

然后在我的恶性脚本,我有一个任务副本,在当前构建环境加上_应用.config并将其复制到app.config。

它讨厌的,但你不能提供商和ConfigurationManager中之间得到欺骗它,说供应商看“开发”或“刺”的连接字符串,只是有3个名为连接字符串。

恶性任务:

<target name="copyconfigs" depends="clean"> 
    <foreach item="File" property="filename" unless="${string::get-length(ConfigPrefix) == 0}"> 
    <in> 
    <items> 
     <include name="**/${ConfigPrefix}App.config" /> 
     <include name="**/${ConfigPrefix}connectionstrings.config" /> 
     <include name="**/${ConfigPrefix}web.config" /> 
    </items> 
    </in> 
    <do> 
    <copy overwrite="true" file="${filename}" tofile="${string::replace(filename, ConfigPrefix,'')}" /> 
    </do> 
    </foreach></target> 

0

可以在“文件”方法,通过@Jonathon建议用某种方式使用connectionStrings部分?

不,但没有什么能阻止您将ConnectionString存储为AppSettings键。


3

编辑:可以在“文件”的方法提示 通过@Jonathon以某种方式与 connectionStrings节使用?

或者您可以在签入配置文件中有多个连接字符串,并使用AppSettings键来确定要使用哪个ConnectionString。我在我的代码库中有以下用途:

public class ConnectionString 
{ 
    public static string Default 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(ConfigurationManager.AppSettings["DefaultConnectionStringName"])) 
       throw new ApplicationException("DefaultConnectionStringName must be set in the appSettings"); 

      return GetByName(ConfigurationManager.AppSettings["DefaultConnectionStringName"]); 
     } 
    } 

    public static string GetByName(string dsn) 
    { 
     return ConfigurationManager.ConnectionStrings[dsn].ConnectionString; 
    } 
}