我在MVC3中使用Entity编写了一个网站(链接到Postgres,但不确定该部分是否相关。
用户是许多“联盟”的一部分,并且会针对其中一个联盟创建“事件”。
将有其他用户可以访问该联盟,当他们去查看事件列表时,我需要列表仅显示他们有权访问的“联盟”中的那些“事件”。
现在有很多方法可以实现这一目标,但我正在寻找最优雅和被广泛接受的“正确方法”。
目前用户 - >联赛关系与其他数据保持在同一个地方,因此我可以毫无问题地通过联赛过滤。我的问题是我不确定是否应该访问HttpContext以使存储库层中的userId进行过滤。
如果我不这样做,我正在考虑使用RoleMembership功能并制作Leagues,Roles,然后内置功能来实现。
问题是,在MVC3 / Entity中用户Access过滤结果数据的最佳做法是什么?
首选博客/教程链接,但也可以接受完整答案......
答案 0 :(得分:1)
我绝对不认为存储库应该调用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());
}
}