打破沙锅--由.net的Profile所想到的......!!!!!

时间:2022-09-20 11:51:10

 profile直接和数据库交互,这对于我们是透明的。使我们摆脱了繁琐的数据库操作代码的编写。把精力放在业务逻辑方面。注意profile与用户相关。我们经常用它来存储一些用户个性化的信息。

profile的实现让我想到了什么呢?

可以把Profile理解为一个工厂,而这个工厂生产什么产品呢?持久化什么产品呢?以前工厂模式是硬编码的,产生什么产品及如何产生都在工厂中编码指定。当我们增加生产一种新品种的时候,不得不重新设计工厂类。原因只有一个,那就是工厂类不是动态生成的。而Profile这个工厂就是动态生成的。

我个人大胆假想:

通过在web.config配置文件中设置Profile的属性(或者说工厂的产品),指定相关的类型信息。在运行时Clr会根据
配置文件反串行化为Profile类。假如 配置:
<profile>
<properties>
<add
name="OO"
allowAnonymous
="true"
 type="CustomType" />
</properties>
</profile>

那么内存中的Profile是什么子呢?(为什么说内存中呢,因为它是Clr动态生成的)

个人假想(  代码不一定正确):

class CustumType{}

class profile
{
     public static CustomType OO
     {
            get{
                         Type type=typeof(CustomType);
                         CustomType ct=type,newInstance();//利用反射
                         .......数据库操作
                        return ct;
                }
            set{OO=value};//在内部可能还实现了到数据库的操作
     }
}
这时,当我们增加新产品或者说新属性的时候,只需在配置文件中添加即可,无须对工厂硬编码.。
 

今后的编程要是都用这样的方法,岂不是很有意思?

我还没有学习hibernate、Spring框架,是不是有相通的地方呢?

 

.net的profile对象可以理解为是一个永久存储的session对象。它与session的唯一区别是它是CLR实现存储到.net平台自带数据库或者是自定义指向的数据库中。这可以在machine.config或者web.config中进行配置Profile。如:Web.Config
<configuration>
<connectionStrings>
<add
name="myConnectionString"
connectionString
=
"Server=MyServer;Trusted_Connection=true;database=MyDatabase"
 />
</connectionStrings>
<system.web>
<anonymousIdentification enabled="true" />
<profile defaultProvider="MyProfileProvider">
<providers>
<add
name="MyProfileProvider"
type
="System.Web.Profile.SqlProfileProvider"
connectionStringName
="myConnectionString" />
</providers>
<properties>
<add
name="FirstName"
allowAnonymous
="true" />
<add
name="LastName"
allowAnonymous
="true" />
</properties>
</profile>
</system.web>
</configuration>

它还涉及到匿名到已经认证用户的状态的改变。
还要在globle.asax中实现已经认证用户的状态到匿名状态的改变
如:Global.asax (C#)可以称它为管道处理程序

<%
@ Application Language="C#" %>
<script runat="server">
    
void Profile_MigrateAnonymous(Object s,  ProfileMigrateEventArgs e)、、//迁移到匿名
    {
        ProfileCommon anonProfile 
= Profile.GetProfile(e.AnonymousId);
        Profile.FavoriteColor 
= anonProfile.FavoriteColor;
    }   
</script>