• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Tony Qu
我的软件工作室
博客园    首页    新随笔    联系   管理     

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

在网上找遍了也没有找到 运行时改变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设置:

<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。


版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
posted @ 2006-12-26 17:12  找事的狐狸  阅读(2890)  评论(5)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3