ASP.NET MVC:normal/admin 用户的关注点分离

ASP.NET MVC: seperatation of concern for normal/admin user

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

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

还有一个附带问题,是否可以在同一个 ASP.Net MVC 解决方案中将管理区和普通用户区真正分开?

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

为了支持关注点分离,控制器应具有 "code" 逻辑,另一层应具有 "business" 逻辑。例如。控制器可能会定义属性的命名方式,但不会定义用户名的长度。无论哪个控制器尝试注册用户,用户名都应至少为 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();
}

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