2013-02-21 29 views
1

我有一個wbe應用程序mvc c#4.0,我想在運行時從代碼初始化DefaultRoleProvider connectionstring(不希望它來自web.config)。 我創建了一個類MyRoleProvider:DefaultRoleProvider初始化DefaultRoleProvider連接字符串代碼

public class MyRoleProvider : DefaultRoleProvider 
{ 

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 

     // Update the private connection string field in the base class. 
     bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string); 

     string connectionString = "local connectionString ... "; 
     if (IsLocal == false) 
      connectionString = "prod connectionString ..."; 
     //ToDo- how to set connection string next property of provider. 
     ?? 
    } 
} 
+0

也許你應該嘗試動態地設置連接字符串中的配置,並重新加載相應的部分。請參閱http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Configuration.ConfigurationManager%29;k%28TargetFrameworkMoniker-.NETFramework – jbl 2013-02-21 17:27:30

+0

我無權更改配置文件。 – 2013-02-21 18:34:34

回答

0

關於第二個想法,你可以嘗試基於反射的東西,像這樣:

public class CustomRoleProvider : SqlRoleProvider 
{  
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 

    // Update the private connection string field in the base class. 
    bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string); 

    string connectionString = "local connectionString ... "; 
    if (!IsLocal) 
    { 
     connectionString = "prod connectionString ..."; 
     System.Reflection.FieldInfo field; 
     field = this.GetType() 
      .GetField("_sqlConnectionString", 
       System.Reflection.BindingFlags.Instance 
       | System.Reflection.BindingFlags.NonPublic); 
     field.SetValue(this, connectionString); 
    } 
} 

------------- ------- 最初的帖子

恐怕最好你可以這樣做,就是動態選擇連接字符串名稱,並引用已經在web.config中聲明的另一個連接。事情是這樣的具有延伸SqlRoleProvider類:

public class CustomRoleProvider : SqlRoleProvider 
{ 

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
    { 
     bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string); 

     string connectionStringName = "local connectionString name "; 
     if (!IsLocal) 
      connectionStringName = "prod connectionString name"; 
     config.Set("connectionStringName", connectionStringName); 
     base.Initialize(name, config); 
    } 
} 

希望這將有助於

+0

我的請求開始於我沒有權限更改網絡配置文件:) ...並且我想讓代碼中的連接字符串安全。 – 2013-02-22 10:33:52

+0

@HaddarMacdasi:這個想法是將它與configsource混合使用(請參閱http://msdn.microsoft.com/en-us/library/ms254494%28v=vs.80%29.aspx中的「使用外部配置文件」恐怕另一個選擇是使用某種Reflector或Resharper工具來解壓縮SqlRoleProvider並在你自己的RoleProvider中使用整個代碼,修改Initialize方法 – jbl 2013-02-22 13:27:27

+0

@HaddarMacdasi:對此主題有另一個想法,編輯我的答案 – jbl 2013-02-25 14:14:17