当前位置:编程学习 > C#/ASP.NET >>

不开启VS角色管理机制,可以用profile建购物车吗?

小弟第一次做网站,没有启用VS的角色管理机制,而是选择了自建数据表来存储用户数据,但是随后发现网站需要一个类似于购物车一样的功能需要靠profile来实现,但是网上搜到的教程发现貌似profile得在启用了角色管理后再能甄别用户,因此我犯难了。
一来,这种类似与购物车的功能想达到无论用户什么时候登录,数据都不会消失的效果,个人认为用cookie,session,临时表都不是很合适。
二来,网站已经完成一半了,如果再重新启用角色管理,要更改数据库结构,变动太大。

还有就是,我对profile的了解不是很清楚,是不是这种方式最终还是会把购物车信息写入数据库,那如果我自己建一个购物车表,来存储购物车的商品信息,是不是可以取代它的功能呢?效率会不会有点低呢?

请大家帮帮小忙,谢谢啦~ Visual Studio 数据库 角色管理 profile --------------------编程问答-------------------- 自己给自己顶一个~ --------------------编程问答-------------------- 购物车随便怎么写好吧?只不过就是关联一下用户 然后判断是不是购物车系统要支持的用户类型 是的话去查找给他分配的购物车的限制信息 
然后在指定的地方(随意你存在数据库还是服务器内存还是客户机子上 ……好吧你要说你想存在url……enjoy it……)把购物车信息写上就行啦

哪里需要依赖神马神马功能啊 扯谈 --------------------编程问答--------------------
引用 2 楼 g4_magicvr 的回复:
购物车随便怎么写好吧?只不过就是关联一下用户 然后判断是不是购物车系统要支持的用户类型 是的话去查找给他分配的购物车的限制信息 
然后在指定的地方(随意你存在数据库还是服务器内存还是客户机子上 ……好吧你要说你想存在url……enjoy it……)把购物车信息写上就行啦

哪里需要依赖神马神马功能啊 扯谈

不好意思,我确实没听懂你说的意思,你可能也没有听懂我的问题的意思。
我是想实现购物车能够记录信息并且不丢失,因此放Session,Cookie显然不能实现,但是放数据库里又会影响存取效率。之后我搜索网络后发现用profile和provider技术是较流行的做法,但是我不是很懂这种方法实现的本质。所以我想问是不是购物车的信息存到了数据库的aspnet_profile表里了,我可不可以自己建一个表来代替呢? --------------------编程问答-------------------- 我的意思是存在哪里其实都无所谓 
因为你加起来只有几个地方存:客户机子上 服务器内存 数据库 URl
你自己都已经排除了客户机 (url基本是搞笑版) 那就只有数据库了(内存只能存储短期数据)

至于用什么框架 最终都是这样的实现 你自己做和用别人做好的事一样的
通常的做法是在数据库放一个持久化记录 临时的记录放在缓存里面 比如 runtime的cache 或者webcache
然后做一个依赖 在缓存被移除/过期的时候持久化到数据库

(管理缓存是缓存策略的问题了) 基本的思路就是这么简单 并不需要采用特定的框架/做法 --------------------编程问答--------------------
引用 3 楼 kansnqr 的回复:
我是想实现购物车能够记录信息并且不丢失,因此放Session,Cookie显然不能实现,但是放数据库里又会影响存取效率。之后我搜索网络后发现用profile和provider技术是较流行的做法,但是我不是很懂这种方法实现的本质。所以我想问是不是购物车的信息存到了数据库的aspnet_profile表里了,我可不可以自己建一个表来代替呢?


你不是嫌“放在数据库”里影响存取效率吗?怎么(假设)人家存在什么aspnet_profile表里,你就会因为“发现比较流行”而赶紧模仿呢?不嫌弃了吗?

数据库存取效率,可以通过数据缓存来改变。但是这需要你自己搞懂数据缓存并且自己设计程序,不是随便抄一个概念就能当程序用的。 --------------------编程问答-------------------- 保存数据,原本是一个程序设计中不足百分之5的东西。但是初学者往往耗费计划时间中的一大块,去纠结什么数据库表问题。

你真正应该花时间研究的,是用户操作行为、用户体验所必须的性能。你真正的技术应该用来解决这些问题,而不是消磨在数据库表设计上。从这个意义来说,你的所谓“设计”纠结其实只能得到“无所谓”的答案,任何设计都会重构的,重构时通常仅需要修改一层中间层代码中的几个方法就行了。而那种整天纠结在最底层的人,是因为没有中间层设计,更没有高层设计。 --------------------编程问答-------------------- profile的意义也就在于“中间件”机制灵活重构的意义。如果需要重构所谓底层基础,那么修改profile实现类中的几个方法就能把原本写到SQL Server中的数据改为写到json文本文件中,或者仅仅在内存中,或者别的什么。

但是看你的描述,你不能理解profile是干什么的,你自己不会借鉴这种设计方法,而仅仅想“既然它使用数据库那么我也一定使用数据库”,那么你自然就得到“无所谓”的判断,因为你只是纠结于数据库表而已,而并不关心为什么要有profile之类的设计。

我并不是说“用或者不用profile”,实际上几乎所有的实用的设计思路都无需纠结于“是非”,但是假设一看就知道你是在很高调地、比较困难地模仿别人的框架的皮毛,这就要提醒你一下。 --------------------编程问答-------------------- 我来说吧。LS几位说的比较概念化,可能对于LZ比较难以理解。
其实ASP.NET自带的PROFIL,就是个写进SQL表的工作。

引用 7 楼 sp1234 的回复:
profile的意义也就在于“中间件”机制灵活重构的意义。如果需要重构所谓底层基础,那么修改profile实现类中的几个方法就能把原本写到SQL Server中的数据改为写到json文本文件中,或者仅仅在内存中,或者别的什么。


7楼这段话的意思是,PROFILE看上去比较灵活或者功能强大(LZ这样认为的),也只是因为微软为“角色”这个东东特殊包装了一套SQL表,以便使用方便。其本质意义还是SQL表的读写,因此,7楼说,只要你想玩的话,也可以不用SQL表,用JSON文本来存储;


引用 楼主 kansnqr 的回复:
还有就是,我对profile的了解不是很清楚,是不是这种方式最终还是会把购物车信息写入数据库,那如果我自己建一个购物车表,来存储购物车的商品信息,是不是可以取代它的功能呢?效率会不会有点低呢?


LZ的这个想法很好,可以丢弃profile不用,自己写表来完成购物车。可以取代它的功能,效率的话,如果你的功力足够,其实只可能比profile更高,而不会比它更低。因为等你用了profile,就知道,它其实会把N个字段,都硬挤压到一个字段中去,再用分隔符分开。缺点是,想手动改表数据,有时候很头疼。 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 4 楼 g4_magicvr 的回复:
通常的做法是在数据库放一个持久化记录 临时的记录放在缓存里面 比如 runtime的cache 或者webcache
然后做一个依赖 在缓存被移除/过期的时候持久化到数据库

(管理缓存是缓存策略的问题了) 基本的思路就是这么简单 并不需要采用特定的框架/做法


谢谢,我明白了,但是如果用cache做一个依赖的话,实现的功能不是当数据库数据改变后,去掉无用的缓存吗?怎么做能够实现过期后把缓存存到数据库呢? --------------------编程问答--------------------
引用 10 楼 kansnqr 的回复:
(管理缓存是缓存策略的问题了) 基本的思路就是这么简单 并不需要采用特定的框架/做法


谢谢,我明白了,但是如果用cache做一个依赖的话,实现的功能不是当数据库数据改变后,去掉无用的缓存吗?怎么做能够实现过期后把缓存存到数据库呢?

= =所谓缓存策略 有一个策略就是缓存被移除的时候进行的操作(出入一个委托 你想做什么都可以)
具体参见MSDN文档 --------------------编程问答--------------------

            string token = Guid.NewGuid().ToString("N");
            WebSetting webSetting = new WebSetting();
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.SlidingExpiration = new TimeSpan(0, webSetting.UserInTime, 0);
            policy.Priority = CacheItemPriority.NotRemovable;
            policy.RemovedCallback = (arguments) =>
                {
                    if (administratorCacheEntity.Keys.Any(x => x == arguments.CacheItem.Key))
                    {
                        administratorCacheEntity.Remove(arguments.CacheItem.Key);
                    }
                };
            administratorCache.Add(token, "", policy);
            administratorCacheEntity.Add(token, administratorId);


这是我的例子 它移除的不是数据库的东西 而是一个静态字典的数据(移除数据库数据道理一样 不需要解释吧?) --------------------编程问答-------------------- ps 我用的是runtime.cache 不是webcache
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,