0

我正在使用实体(链接到 Postgres,但不确定该部分是否相关)在 MVC3 中编写一个站点。

用户是多个“联盟”的一部分,并针对其中一个联盟创建“事件”。

将有其他用户可以访问该联赛,当他们查看事件列表时,我需要该列表仅显示他们有权访问的“联赛”中的那些“事件”。

现在有很多方法可以实现这一点,但我正在寻找最优雅和被广泛接受的“正确方法”。

目前,用户 -> 联赛关系与其余数据保存在同一位置,因此我可以毫无问题地按联赛进行过滤。我的问题是我不确定是否应该访问 HttpContext 以获取存储库层中的 userId 来执行过滤。

如果我不执行上述操作,我正在考虑使用 RoleMembership 功能并制作联赛、角色,然后有内置功能可以做到这一点。

问题是,在 MVC3/Entity 中按用户访问过滤结果数据的最佳做法是什么?

博客/教程链接是首选,但也可以接受完整的答案...

4

1 回答 1

1

我绝对不认为存储库应该调用 HttpContext 对象。我建议遵循此应用程序的依赖注入模式。在这个场景中,有三个接口——一个是数据访问接口(repository);一个是数据访问接口(repository);另一个是为您的视图(视图模型)提供过滤数据的提供者;第三个是角色信息的提供者(角色提供者)。

因此,存储库是独立的;角色提供者对 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());
    }
}
于 2012-04-15T18:55:59.170 回答