2016-03-15 21 views
1

我將單獨管理ASP.NET MVC 5.2項目的普通用戶部分。我的管理員區域和普通用戶區域共享了很多東西,但是他們每個人的權限和詳細信息是不同的。ASP.NET MVC:關注正常/管理用戶的分離

現在我不知道如何區分管理區域和普通用戶區域。我不知道我是否應該爲管理面板創建不同的項目,或者我應該將管理員路由到不同的路徑並使用相同的控制器?或者我應該路由到不同的路徑並使用不同的視圖/控制器?

另一個問題是,是否有可能在同一個ASP.Net MVC解決方案中有真正物理上分離的管理員和普通用戶區域?

+0

您是否知道MVC領域? – DavidG

+1

我認爲真正的問題是如果您使用'Areas',如果您需要管理面板看起來像普通應用程序+另一個管理工具 –

+0

@RoyalBg感謝您的通知,您可以避免純代碼重複。似乎這就是我正在尋找 – VSB

回答

2

通常在應用程序中有不同的終端使用相同的業務邏輯。我們應該在這種情況下做什麼?我們可以輕鬆地複製一個端點並將其粘貼到另一個端點,但是一旦業務案例發生變化,我們就需要更改代碼中的任何地方。

爲了分離問題,控制器應該有「代碼」邏輯,另一個層應該有「業務」邏輯。例如。控制器可能會定義如何命名屬性,但不定義用戶名的長度。無論哪個控制器嘗試註冊用戶,用戶名至少應爲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

+0

你知道有任何書籍或參考資料裏面有這種類型的信息嗎? – VSB

+0

完全沒有。 MSDN爲此提供了一些討論和文章。查看官方存儲庫模式文章http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and -unit-of-work-patterns-in-an-asp-net-mvc-application和討論版本庫與服務層在SO http://stackoverflow.com/questions/4368134/asp-net-service-vs-庫層 –