我正在用MVC3写一个网站,使用Entity (链接到Postgres,但不确定这部分是否相关。
用户是许多“联盟”的一部分,并且创建针对这些联盟之一的“事件”。
将会有其他用户有权访问该联盟,当他们去查看事件列表时,我需要该列表仅显示那些属于他们有权访问的“联盟”的“事件”。
现在有许多方法可以实现这一点,但我正在寻找最优雅和被广泛接受的“正确的方法”。
目前,用户->联盟关系与其余数据保存在相同的位置,因此我可以只按联盟进行过滤,没有问题。我的问题是,我不确定是否应该访问HttpContext来获取存储库层中的userId来执行过滤。
如果我不做上面的事情,我正在考虑使用RoleMembership的功能,让联盟,角色,然后有内置的功能来做到这一点。
问题是,在MVC3/Entity中按用户访问过滤结果数据的最佳实践是什么?
博客/教程链接是首选,但也可以接受完整的答案...
发布于 2012-04-16 02:55:59
我绝对不认为存储库应该调用HttpContext对象。对于这个应用程序,我建议遵循依赖注入模式。在这个场景中,有三个接口--一个是数据访问接口(存储库);另一个是视图的过滤数据提供者(视图模型);第三个是角色信息提供者(角色提供者)。
因此,存储库是独立的;角色提供程序依赖于HttpContext(我从您的问题中收集到的);视图模型具有存储库和角色提供程序的依赖关系。我要强调的是,为了便于测试,您要为计划使用的任何HttpContext方法编写依赖项包装。
在MSDN上有一个相当广泛的关于依赖注入和MVC的教程:http://msdn.microsoft.com/en-us/gg618491
举例说明:
public interface ILeagueRepository
{
IEnumerable<League> All;
}
public interface ILeaguesProvider
{
IEnumerable<League> GetUserLeagues(string Username);
}
public class LeaguesProvider : ILeaguesProvider
{
public LeaguesProvider(ILeagueRepository repository)
{
// ...
}
public IEnumerable<League> GetUserLeages(string Username)
{
return _repository.All.Where(league=>league.User == Username);
}
}
public ActionResult LeaguesController
{
public LeaguesController(ILeaguesProvider providerDependency, IRoleProvider roleDependency)
{
IEnumerable<League> leagues = providerDependency.GetUserLeagues(roleDependency.GetCurrentUser());
}
}https://stackoverflow.com/questions/10164677
复制相似问题