Asp.net mvc 我如何有效地实现如此喜欢的收藏夹和投票功能?
我正在使用ASP.NETMVC、SQLServer2008和表单身份验证。假设我正在建立一个问答网站,就像这样 以下是我遇到的问题: 用户可以在未登录时查看几乎所有的问题,就像他们在登录时一样。问题获取、查询等几乎都是书面的 现在,如果用户登录,他还应该能够判断他是否已经投票或“赞成”这个问题,如下图所示Asp.net mvc 我如何有效地实现如此喜欢的收藏夹和投票功能?,asp.net-mvc,Asp.net Mvc,我正在使用ASP.NETMVC、SQLServer2008和表单身份验证。假设我正在建立一个问答网站,就像这样 以下是我遇到的问题: 用户可以在未登录时查看几乎所有的问题,就像他们在登录时一样。问题获取、查询等几乎都是书面的 现在,如果用户登录,他还应该能够判断他是否已经投票或“赞成”这个问题,如下图所示 我要回去重写我所有的作品吗 要包含useridit的查询 参数,即使用户是 我只是想知道这一点 信息 或者当用户登录时 在我看来,他所投的票都是我的 并全程跟踪 他的疗程 两者看起来都很麻烦,
我认为它不会记录用户是否投票,但它似乎会记录用户是否“赞成”这个问题 您可以使用多个接口,一个用于匿名访问,一个用于身份验证访问,并对每个接口执行不同的查询:
//只是示例代码-不是asp.net-mvc
接口匿名读卡器
{
IEnumerable GetAnswers(int page,int countPerPage);
}
接口IAAuthenticateDreader
{
IEnumerable GetAnswers(整版,整版),
int用户标识);
//另一种方法是从具体类中获取userId,并传入ctor
}
这将要求您编写多个查询,或者返回您刚刚丢弃的数据。通过编程构造查询,可以避免代码重复。通过使用ORM,可以避免首先编写查询
至于数据,您可以对数据进行规范化,以便投票信息位于单独的表中,但仍然绑定到答案。当您为匿名用户执行查询时,只需不加入/查询该表。是,数据是标准化的。但是,基本上您要求我编写两个版本的fetch查询。我必须使用接口吗?@progick:不,你不必使用接口。对同一基础数据进行多个表示被认为是一个强有力的设计原则。这些是否是类、抽象类、接口、Web服务接口等都是实现细节。为什么会厌恶多重查询?代码(或代码复制)真的有那么大吗?如果您真的无法忍受代码重复(例如,以编程方式构造查询字符串),那么可以使用一些技术,并且可以通过使用ORM层避免编写查询本身。就像我有7-8个查询来获取问题,现在我必须返回并编写7-8个查询。。但没关系,我guess@progtick:这些查询中有多少需要更改,有多少相同?您可以将这些查询的字符串放在公共区域中,因此只需编写一次重复的查询。如果大字符串中有重复的部分,则可以拆分字符串并将其连接在一起,或者如果查询是嵌套的,则生成函数以将一个查询字符串与外部查询包装在一起。@progtick:如果问题确实是如何避免重复查询,是否可以放置一些(精简、修改以避免暴露您的私人数据)问题中查询的版本,以便我们可以帮助您解决该问题。或者您可以提出第二个问题。
// Just example code - not asp.net-mvc
interface IAnonymousReader
{
IEnumerable<Answer> GetAnswers(int page, int countPerPage);
}
interface IAuthenticatedReader
{
IEnumerable<AuthenticatedAnswer> GetAnswers(int page, int countPerPage,
int userId);
// An alternative here is to get userId from concrete class, and pass in ctor
}