我正在使用ASP.NET MVC,SQL Server 2008和Forms身份验证。假设我正在构建像SO这样的问答网站。
以下是我遇到的问题:
用户可以在未登录时查看几乎所有问题,就像在SO上一样。提问问题查询等几乎都是写的。
现在,如果用户已登录,他还应该能够判断他是否已经投票或“收藏”了这个问题,就像在SO上一样。
两者看起来都很麻烦,但1)似乎至少效率更高。谁知道SO如何做到这一点或更有效?
我认为它不会跟踪用户是否投票,但它似乎确实跟踪用户是否“收藏”了该问题。
答案 0 :(得分:2)
您可以使用多个接口,一个用于匿名访问,另一个用于经过身份验证的访问,并为每个接口执行不同的查询:
http://en.wikipedia.org/wiki/Interface_segregation_principle
// 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
}
这需要您编写多个查询,或者您要获取刚刚丢弃的数据。您可以通过以编程方式构建查询来避免代码重复。您可以通过使用ORM来避免编写查询。
对于数据,您可以规范化数据,以便投票信息位于单独的表中,但仍然绑定到答案。当您对匿名用户进行查询时,只需不要加入/查询该表。