【问题标题】:ASP.NET MVC: seperatation of concern for normal/admin userASP.NET MVC:普通/管理员用户的关注点分离
【发布时间】:2025-11-29 20:20:07
【问题描述】:

我将分离我的 ASP.NET MVC 5.2 项目的管理员和普通用户部分。我的管理区和普通用户区共享了很多东西,但是它们各自的权限和详细信息是不同的。

现在我不知道如何区分管理区和普通用户区。我不知道我是否应该为管理面板创建不同的项目,或者我应该将管理员路由到不同的路径并使用相同的控制器?还是应该路由到不同的路径并使用不同的视图/控制器?

还有一个附带的问题,在同一个 ASP.Net MVC 解决方案中是否有可能在物理上真正分离管理员和普通用户区域?

【问题讨论】:

  • 你了解 MVC 领域吗?
  • 我认为真正的问题是如果您使用Areas,如果您需要管理面板看起来像普通应用程序 + 另一个管理程序,如何避免纯代码重复
  • @RoyalBg 感谢您的通知。看来这就是我要找的东西
  • @RoyalBg 可以分享不同区域的模型吗?
  • 是的,模型是共享的。如果将业务逻辑提取到服务层,则可以让“单线”控制器在用户和管理区域调用服务

标签: c# asp.net asp.net-mvc asp.net-mvc-5.2


【解决方案1】:

通常在应用程序中有不同的端点使用相同的业务逻辑。在这种情况下我们应该怎么做?我们可以轻松地复制一个端点并将其粘贴到另一个端点,但是一旦业务案例发生更改,我们就需要在代码中的任何地方进行更改。

为了支持关注点分离,控制器应该有“代码”逻辑,而另一层应该有“业务”逻辑。例如。控制器可能会定义属性的命名方式,但不会定义用户名的长度。无论哪个控制器尝试注册用户,用户名都应至少为 3 个字符。

为满足业务案例要求而使用实体模型进行的所有操作都应移至单独的层。通常称为服务层。

您的所有控制器都可以使用任何服务,而无需了解背后的业务场景。

这里的一个简单示例是两个控制器操作 - 一个 - 编辑您自己的配置文件,另一个 - 管理员编辑任意用户配置文件。

[Authorize]
public IActionResult Edit(UserViewModel model) {
    if(model.Id != this.CurrentlyLoggedUser.Id) { 
        return this.RedirectToAction(...);
    }

    var userService = new UserService(); // inject maybe
    userService.EditById(model.Id, model);

    return this.View();
}

和管理操作

[Authorize("Admin")]
public IActionResult Edit(UserViewModel model) {
    var userService = new UserService(); // inject maybe
    userService.EditById(model.Id, model);

    return this.View();
}

这里的“代码”逻辑是——创建服务,调用封装的编辑逻辑。该操作还应注意一些安全原因 - AuthorizeAuthorize Admin

【讨论】:

  • 您知道有哪些书籍或参考资料中包含此类信息吗?
  • 一点也不。 MSDN 对此有一些讨论和文章。看看官方存储库模式文章asp.net/mvc/overview/older-versions/… 和 SO *.com/questions/4368134/… 中的讨论存储库与服务层
  • SUMMARY :您应该必须为管理员和用户面板使用相同的控制器,但您需要在确认之前对其进行授权。视图/路由可能不同,但建议控制器应保持不变,以改进更改控制机制。