Как получить запрос в конструкторе ApiController? - PullRequest
0 голосов
/ 23 ноября 2018

Задача
У меня есть класс DataMapper, который я использую для отображения данных в пользовательские представления для мобильного клиента моего веб-API.

public class DataMapper
    {
        public static string Role { get; set; }
        public static RoleReturnModel Create(IdentityRole appRole)
        {
            return new RoleReturnModel
            {
                Id = appRole.Id,
                Name = appRole.Name
            };

        }
        public static CountryReturnModel Create(Country country)
        {
            return new CountryReturnModel
            {
                Id = country.Id,
                Name = country.Name,
                CityList = country.Cities.Select(city => DataMapper.Create(city))
            };

        }
        public static CityReturnModel Create(City city)
        {
            return new CityReturnModel
            {
                Id = city.Id,
                Name = city.Name,
            };

        }
}

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

Проблема
Я думал, что лучшее место для этого - DataMapper.Role = CurrentRole:в конструкторе моего ApiController

public class BaseApiController : ApiController
{
    private ModelFactory _modelFactory;
    private ApplicationUserManager _AppUserManager = null;
    private ApplicationRoleManager _AppRoleManager = null;

    protected BaseApiController()
    {
       //Request is null here
        DataMapper.Role = Request.GetOwinContext().GetUserManager<ApplicationRoleManager>().FindById(User.Identity.GetUserId()).Name; 
    }

Это, однако, не работает.Объект запроса является нулевым в конструкторе.Это только заполняется в моем реальном веб-методе

public class UsersController : BaseApiController
{

    IUserRepository UserRepository;
    public UsersController() // will use ninject for constructor injection
    {
        UserRepository = new UserRepository();
    }

    [Route("profile")]
    public IHttpActionResult GetUser()
    {
         //Request is available here
    }

Я новичок вебапи.Нужны указатели на эту проблему.

1 Ответ

0 голосов
/ 23 ноября 2018

Запрос пока недоступен в конструкторе.Вы можете получить к нему доступ в действии / методе только после того, как контроллер уже был инициализирован.можно использовать повторно

var role = this.GetUserRole();

Где

public static string GetUserRole(this ApiController controller) {
    var request = controller.Request;
    var user = controller.User
    return request.GetOwinContext()
        .GetUserManager<ApplicationRoleManager>()
        .FindById(user.Identity.GetUserId()).Name;     
}
...