现在的位置: 首页 > 综合 > 正文

如何在运行时改变User Profile的Provider

2011年01月23日 ⁄ 综合 ⁄ 共 1750字 ⁄ 字号 评论关闭

在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设置:

<profile defaultProvider="AspNetSqlProfileProvider">
      
<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来保存数据的话,我们可以用下面的语句:

ProfileCommon.Properties["test"].Provider = Profile.Providers["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。

抱歉!评论已关闭.