2016-09-05 9 views
0

У меня проблема архитектуры, и я надеюсь, что кто-то может помочь мне в более идеальной стратегии. То, как я был вынужден сделать это, пахнет «запахом кода».Архитектура пользовательских ролей в ASP.NET MVC 5, проблемы с впрыском зависимостей

У меня есть два разных типа «Роли». У меня есть встроенные Роли идентичности, и у меня есть собственный набор ролей (Роли Группы пользователей). Я храню эти Роли Группы пользователей в базе данных, по существу, отношения между идентификатором пользователя, идентификатором роли группы пользователей и идентификатором группы пользователей. Я использую Ninject для инъекции зависимостей моего UserGroupService, который обрабатывает все операции CRUD для назначения пользователей определенным ролям в группах пользователей.

Мой первый план атаки заключался в создании специального атрибута авторизации, который я мог бы разместить на действиях, аналогичных атрибуту 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); 
    } 

Проблема здесь в том, что я должен сделать это в любое время, я хочу, чтобы определить, какую роль пользователь в настоящее время он работает, но он пахнет..

Я что-то упустил? Я думаю, что самым идеальным вариантом будет стратегия метода расширения, позволяющая сразу вызвать его пользователя, но, похоже, не может сделать эту работу.

ответ

0

Конструктор DI - это не единственный способ получить доступ к зависимости.

Каждый МОК имеет способ разрешить зависимость, все, что вам нужно, это ссылка на контейнер МОК. Таким образом, даже если ваш атрибут требует конструктора без параметров, вы все равно можете разрешить зависимость вручную.

Что-то, как это должно помочь:

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

Это отличный способ использовать ваш МОК таким образом? Наверное, нет, но я уверен, что ты делаешь сейчас.