Aynı şeyi yapmaya ihtiyacım vardı, bağlantı dizesini web.config dosyasında değil, kod yoluyla ayarlayın, ancak isimden daha fazla değiştirmem gerekiyordu. Dinamik olarak oluşturulacak gerçek değeri düzenledi.
...
<connectionStrings>
<add name="ConnectionPlaceHolder" connectionString="This is a place holder"/>
</connectionStrings>
...
<roleManager defaultProvider="SqlRoleProvider" enabled="true">
<providers>
<clear/>
<add name="SqlRoleProvider" type="MyClassLibraries.Web.Security.MyCustomSqlRoleProvider" connectionStringName="ConnectionPlaceHolder" applicationName="MyApplicationName"/>
</providers>
</roleManager>
Sağlayıcı Sınıf
public class MySqlRoleProvider : SqlRoleProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
try
{
config["connectionStringName"] = "ConnectionPlaceHolder";
base.Initialize(name, config);
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, ApplicationConfiguration.RetrieveApplicationConfigurationValue(myConnectionString));
}
catch (Exception ex)
{
CurrentOperation.RaiseException(ex);
throw ex;
}
}
private string myConnectionString()
{
return "Server=MyServer;database=MyDB;uid=aspnetDBUser;pwd=myPassword"
}
}
Eğer base.Initialize çağrı
(
web.config: Eğer gerçek bağlantı dizesini değiştirmek isterseniz aşağıdakileri yapabilirsiniz koddan oluşturulacak) .NET sınıfı , için web.config dosyasında belirtilen bir ad olmalıdır, bu nedenle bir şey koymak zorundasınız, bu yüzden kodda geçersiz sayılacağımı bildiğimden beri bir yer tutucu kullandım.
Ekibimiz bunu gerçekleştirdi çünkü farklı ortamlara bağlı olarak bağlantı dizelerini dinamik olarak oluşturmamız gerekiyordu ve etrafta yüzen birden fazla web.confuzu bulunması konusunda endişelenmek istemedik.
Joe'nun cevabının .NET 4.0 için çalışacağına, ancak .NET 2.0-3.5'e değil, Flea'nın yanıtının da çalışacağına dikkat edilmelidir. – nateirvin