1

私は wbe アプリ mvc c#4.0 を持っています。実行時にコードから DefaultRoleProvider 接続文字列を初期化したい (web.config からは望まない)。クラス MyRoleProvider を作成しました: 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.  
        ??
    }  
}  
4

1 に答える 1

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);
    }  
} 

これが役立つことを願っています

于 2013-02-21T20:51:07.467 に答える