2016-09-05 72 views
0

我有一個架構問題,我希望有人能夠幫助我指導一個更理想的策略。我被迫做這種「代碼味道」的方式。ASP.NET MVC 5,依賴注入問題中的自定義角色體系結構

我有兩種不同的「角色」。我有內置的Identity Roles,並且有一組自定義的角色(用戶組角色)。我將這些用戶組角色存儲在數據庫中,實質上是用戶標識,用戶組角色標識和用戶組標識之間的關係。我正在使用Ninject進行依賴注入UserGroupService,它處理將具有特定用戶組角色的用戶分配給用戶組的所有CRUD操作。

我的第一個攻擊計劃是創建一個自定義授權屬性,我可以將其放置在與Identity [Authorize(Role =「」)]屬性類似的操作上。我沒有任何運氣,因爲我不能注入一個服務到一個屬性類(需要一個無參數的構造函數)。

之後沒有奏效,我的第二個攻擊計劃是爲IPrincipal寫一個擴展方法,實質上是用User.IsInUserGroupRole(「」)來模擬User.IsInRole(「」)。這不起作用,因爲我無法將服務注入靜態類。

目前我被困在包含一些布爾模型的基於角色的邏輯涉及的每個視圖的模型中。因此,例如:

public ActionResult Navigation() 
    { 
     var isSystemAdmin = User.IsInRole("Administrator"); 
     var isUserGroupAdmin = _userGroupService.IsUserGroupAdmin(User.Identity.GetUserId()) && !isSystemAdmin; 
     var isGeneralUser = !isSystemAdmin && !isUserGroupAdmin; 

     var model = new NavigationViewModel 
     { 
      IsSystemAdmin = isSystemAdmin, 
      IsUserGroupAdmin = isUserGroupAdmin, 
      IsGeneralUser = isGeneralUser 
     }; 

     return PartialView("_Navigation", model); 
    } 

這裏的問題是,我該做的任何時候,我要確定用戶是什麼樣的角色,目前在它的工作原理,但它的氣味。

我失去了一些東西在這裏?我認爲最理想的選擇將是能夠稱之爲用戶的擴展方法策略,但似乎無法做到這一點。

回答

0

構造函數DI不是訪問依賴項的唯一方法。

每個IOC都有一種解決依賴的方法,您只需要對IOC容器進行引用。因此,即使您的屬性需要無參數構造函數,仍然可以手動解析依賴項。

像這樣的東西應該有所幫助:

http://www.c-sharpcorner.com/UploadFile/47fc0a/resolving-dependency-using-ninject/

的是它使用國際奧委會這樣一個偉大的方式?可能不會,但它肯定會打敗你現在正在做的事情。