如何在运行时改变User Profile的Provider
在asp.net 2.0中有专门的Profile Provider用于为User Profile提供下层的存储服务。(如果你对User Profile不熟悉,请看http://www.cnblogs.com/tonyqus/archive/2005/12/18/userprofilev2.html)
当然,asp.net也允许我们定制自定义的User Profile Provider,这为多服务器或多种存储介质提供了方便。比如我们可以把Profile存储在Oracle的服务器上,通过实现System.Web.Profile.ProfileProvider抽象类自定义一个OracleProfileProvider就可以满足这样的需求。但通常我们都是在web.config中设置defaultProvider来切换Provider的,这意味着我们无法在运行时修改Provider。如果要用SqlProfileProvider就必须一直使用它。但这无法满足一些特殊的项目需求,比如根据用户的不同,使用不同的Profile数据库。
于是我在网上找了很多资料,但都没有有关如何在运行时修改Profile Provider的方法,只看到如何在运行时修改Membership Provider以及如何自定义Profile Provider的文章。为了实现这一点,特地用Reflector分析了默认的存储方法。得出的结论如下:
假设我们在web.config中有这样的profile设置:
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" connectionStringName="strConnUserDB" type="System.Web.Profile.SqlProfileProvider" description="存储Profile数据"/>
<add name="TextFileProfileProvider" type="CustomProviders.TextFileProfileProvider, CustomProviders" description="Text file profile provider"/>
</providers>
<properties>
<add name="test"/>
</properties>
</profile>
如果我们要让Profile["test"]使用TextFileProfileProvider来保存数据的话,我们可以用下面的语句:
Profile["test"] = "bbb";
下面我们来分析一下原理。
我们通常使用的Profile其实是一个ProfileCommon的一个实例,Profile.Providers属性提供了在web.config的providers节中设置的自定义Provider,我们可以用Profile.Providers["ProviderName"]这样的代码来获得一个自定义Provider,注意这里的ProviderName是providers节中的每一个provider的name属性。由于Properties属性是静态属性,无法通过ProfileCommon的实例来调用,所以只能用类调用。
在ProfileCommon类内部有一个SettingsPropertyCollection用于存储所有的Profile属性,而其中每个SettingsProperty就代表一个Profile属性,对于每个SettingsProperty有三个必要元素:name, value和provider,这也是为什么我们可以对某个Profile属性设置provider。
版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。