Profile的出现解决了如上的烦恼,它可以将用户的个人化信息保存在指定的数据库中。ASP.NET 2.0的Profile功能默认支持Access数据库和SQL Server数据库,如果需要支持其他数据库,可以编写相关的ProfileProvider类。Profile对象是强类型的,我们可以为用户信息建立属性,即和该用户关联的一些类。如购物车啊,待处理的审批任务啊,等等。(这个是我在使用时的理解,不知道对不对哈)
要使用Profile的功能有以下几步:
1.配置:
<profile automaticSaveEnabled="false" defaultProvider="FirstProvider(默认的配置文件提供程序)">
<providers>
要添加的自定义profile提供程序(如:购物车一个,待处理的审批任务一个)
<add name="FirstProvider" connectionStringName="SQLProfileConnString" type="TestAppLication.MyProfileProvider" applicationName="TestAppLication"/>
<add name="SecondProvider" connectionStringName="SQLProfileConnString" type="TestAppLication.MyProfileProvider" applicationName="TestAppLication"/>
</providers>
<properties>
下面是对应的自定义profile提供程序关联的属性
<add name="MyCart" type="TestAppLication.Cart" allowAnonymous="true" provider="FirstProvider"/>
<add name="MyTask" type="TestAppLication.Task" allowAnonymous="true" provider="SecondProvider"/>
</properties>
</profile>
以上设置可以配置和用户相关的两个功能。
2.重写ProfileProvider类。
(1)、重写Initialize这个函数,初始化自定义profile提供程序:
public override void Initialize(string name, NameValueCollection config) {
if(config == null)
throw new ArgumentNullException("config");
if(string.IsNullOrEmpty(config["description"])) {
config.Remove("description");
config.Add("description", "MyProvider");
}
if(string.IsNullOrEmpty(name))
name = "MyProfileProvider";
if(config["applicationName"] != null && !string.IsNullOrEmpty(config["applicationName"].Trim()))
applicationName = config["applicationName"];
base.Initialize(name, config);
}
(2)、重写GetPropertyValues和SetPropertyValues两个函数。其作用是获取和设置一个和当前用户相关的属性对象。
获取:
public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection) {
string username = (string)context["UserName"];//当前访问用户
bool isAuthenticated = (bool)context["IsAuthenticated"];//匿名用户还是正式用户
SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection();
foreach(SettingsProperty prop in collection) {
SettingsPropertyValue pv = new SettingsPropertyValue(prop);
switch(pv.Property.Name) {
case "MyCart":
pv.PropertyValue = GetMyCart(username);//得到当前用户的购物车信息
break;
case "MyTask":
pv.PropertyValue = GetMyTask(username);//得到当前用户的任务信息
break;
default:
throw new ApplicationException("怎么会没有定义属性嘛!!");
}
svc.Add(pv);
}
return svc;
}
设置:
public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) {
string username = (string)context["UserName"];
bool isAuthenticated = (bool)context["IsAuthenticated"];
//将当前连接用户转换为用户ID
int uniqueUserID = GetUniqueUserID(username);
if(uniqueUserID == 0)
uniqueUserID = CreateUser(username);
foreach(SettingsPropertyValue pv in collection) {
if(pv.PropertyValue != null) {
switch(pv.Property.Name) {
case "MyCart":
SetMyCart(uniqueID, (MyCart)pv.PropertyValue);
break;
case "MyTask"
SetMyTask(uniqueID, (MyTask)pv.PropertyValue);
break;
default:
throw new ApplicationException("怎么会没有定义属性嘛!!");
}
}
}
}
(3)还要重写DeleteProfiles(包括重载的几个函数)、DeleteInactiveProfiles(删除没有活动的用户)、FindProfilesByUserName、FindInactiveProfilesByUserName(不活动的用户配置信息)、GetAllProfiles、GetAllInactiveProfiles(得到所有不活动用户的配置信息)、GetNumberOfInactiveProfiles
重写以上函数,将相应功能和对应的表联系起来,也就是Profile这个表的增、删、改
说明:MyCart、MyTask这个类就是购物车的相关逻辑,处理任务的相关逻辑。
3.使用自定义Profiles。
在ASP.NET页面直接用Profile.MyCart就可以得到当前连接用户的购物车信息。Profile.MyTask可以得到当前用户的待处理的任务信息。
当前连接用户添加购物车也很简单,如果MyCart类封装了一个Add(Modl.Cart)的话。我们直接这样:
Profile.MyCart.Add(Modl.Cart);
Profile.Save();
这样就行了,当然我们在配置里面要把automaticSaveEnabled="false"设置为"false"
执行Profile.Save()自动会执行我们重写的SetPropertyValues函数。
这样操作是不是很简单,操作也很清晰呢,也不会用到以前我们用的SESSION了