Изменить строку профиля ProfileProvider на лету - PullRequest
1 голос
/ 04 января 2012

Если вы прочитали мой предыдущий пост, вы знаете, что я могу использовать пользовательские MembershipProvider и RoleProvider для использования разных источников данных при каждом вызове на лету.Я хочу сделать то же самое с Профилем.

Свойства моего профиля хранятся не в веб-конфигурации, а в пользовательском классе, подобном этому:

public class AccountProfile : ProfileBase
{

    public override SettingsProviderCollection Providers
    {
        get
        {
            return base.Providers;
        }
    }

    static public AccountProfile GetUserProfile(string userName)
    {
        return (AccountProfile)(ProfileBase.Create(userName));
    }

    [SettingsAllowAnonymous(false)]
    public string MobilePhone
    {
        get { return ((string)(base["MobilePhone"])); }
        set { base["MobilePhone"] = value; Save(); }
    }
}

также как для Membership и RoleProviderУ меня есть такой класс:

public class MyProfileProvider : SqlProfileProvider
{
    public MyProfileProvider()
    {
    }

    public MyProfileProvider(string SubDomainInstanceName)
    {
        string configPath = "~/web.config";
        Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);
        ProfileSection section = (ProfileSection)config.GetSection("system.web/profile");
        ProviderSettingsCollection settings = section.Providers;
        NameValueCollection membershipParams = settings[section.DefaultProvider].Parameters;

        Initialize(section.DefaultProvider, membershipParams);
    }


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

        base.Initialize(name, config);

        if (!string.IsNullOrEmpty(instance))
        {
            // Update the private connection string field in the base class.   
            string connectionString = "";//my connection 
            // Set private property of Membership provider.   
            FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
            connectionStringField.SetValue(this, connectionString);
        }
    }        
}

Разница между моим CustomProfileProvider заключается в том, что я не могу использовать сам себя, потому что метод "create" находится в ProfileBase.И с ILSpy я видел синглтон, и мне интересно, не является ли это источником проблемы.Проблема в том, что я передаю только один раз в методе initialize.Я не могу в другой раз изменить источник данных.

Надеюсь, вы понимаете мой плохой английский и можете мне помочь.

1 Ответ

1 голос
/ 05 января 2012

Я найду - плохое - решение

В классе CustomProfileBase я добавляю некоторый код для изменения строки соединения экземпляра синглтона класса.

public class AccountProfile : ProfileBase
{
         string connectionString = myconnstring;

        //1st call not really use but allow to get an instance of my custom AccountProfile
        AccountProfile test = (AccountProfile)(ProfileBase.Create(userName));                

        //change connectionstring oh the instance
        FieldInfo connectionStringField = test.Providers["AspNetSqlProfileProvider"].GetType().BaseType.GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
        connectionStringField.SetValue(test.Providers["AspNetSqlProfileProvider"], connectionString);

        //new call on the good datasource
        return (AccountProfile)AccountProfile.Create(userName);
}

Это не самое красивое решение по работе.

Что ты думаешь о т?

...