2016-09-05 9 views
0

나는보다 이상적인 전략으로 나를 안내하기 위해 누군가가 도움을 줄 수있는 아키텍처 문제가 있습니다. 내가 "코드 냄새"의 냄새를 맡도록 강요당한 방식.ASP.NET의 사용자 지정 역할 아키텍처 MVC 5, 종속성 주입 문제

"역할"에는 두 가지 종류가 있습니다. 내장 된 ID 역할이 있고 사용자 지정 역할 세트 (사용자 그룹 역할)가 있습니다. 기본적으로 사용자 ID, 사용자 그룹 역할 ID 및 사용자 그룹 ID 간의 관계를 데이터베이스에 저장합니다. 특정 사용자 그룹 역할을 가진 사용자를 사용자 그룹에 할당하는 모든 CRUD 작업을 처리하는 내 UserGroupService의 종속성 주입에 Ninject를 사용하고 있습니다.

첫 번째 공격 계획은 Identity [Authorize (Role = "")] 속성과 비슷한 액션에 배치 할 수있는 사용자 지정 인증 속성을 만드는 것이 었습니다. 속성 클래스에 서비스를 삽입 할 수 없으므로 아무런 운이 없었습니다 (매개 변수없는 생성자 필요).

그 후에 작동하지 않는 두 번째 공격 계획은 IPrincipal 확장 메서드를 작성하여 User.IsInRole ("")을 User.IsInUserGroupRole ("")으로 모방 한 것입니다. 정적 클래스에 서비스를 삽입 할 수 없기 때문에 이것은 작동하지 않습니다.

현재 역할 기반 논리가 포함 된 모든보기의 모델에 일부 부울을 포함하여 막혔습니다. 예를 들면 그래서 :.

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); 
    } 

여기서 문제는 내가이에게 나는 사용자가 현재 역할의 어떤 종류의 의미가 있습니다 결정하기 위해 원하는 시간을 할 필요가 있다는 것입니다,하지만 냄새가 난다.

여기에 뭔가가 있습니까? 가장 이상적인 옵션은 User에서 바로 호출 할 수있는 확장 방법 전략이지만이 작업을 수행 할 수는 없다고 생각합니다.

답변

0

생성자 DI가 종속성에 대한 액세스 권한을 얻는 유일한 방법은 아닙니다.

각 IOC에는 종속성을 해결하는 방법이 있으므로 필요한 것은 IOC 컨테이너에 대한 참조입니다. 따라서 속성에 매개 변수없는 생성자가 필요한 경우에도 종속성을 수동으로 해결할 수 있습니다. 이 같은

뭔가 도움이 될 것입니다 : 그것은 당신의 IOC이 방법을 사용할 수있는 좋은 방법

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

인가? 아마 아니지만 그것은 당신이 지금하고있는 것을 능가 할 것입니다.