Как создать ответ из универсального класса, содержащего данные HttpContext, в веб-API ASP.NET Core 5C#

Место общения программистов C#
Ответить
Anonymous
 Как создать ответ из универсального класса, содержащего данные HttpContext, в веб-API ASP.NET Core 5

Сообщение Anonymous »

Я пишу проект веб-API в .NET 5 и хочу, чтобы все мои контроллеры/ответы на действия имели определенный тип. Это позволяет мне включать в каждый ответ некоторую информацию, например информацию о текущем пользователе (и многое другое).
Мой общий ответ выглядит следующим образом (я оставил только соответствующий код):

Код: Выделить всё

public class MyResponse
{
public T data { get; set; }
public User user { get; set; }
public MyResponse(T inputData)
{
data = inputData;
}
}
И я установил реакцию на действие контроллера следующим образом:

Код: Выделить всё

public IActionResult Get()
{
var response = new MyResponse("Hello");
return Ok(response);
}
Идея состоит в том, что ответ всегда содержит свойство data с фактическими данными и множество других свойств с метаданными.
проблема заключается в том, как включить информацию о вошедшем в систему пользователе в .NET 5. В .NET 4.x вы можете получить доступ к HttpContext из любого места, чтобы вы могли заполнить свойство User. Но это невозможно в .NET 5.
Первое, что я попробовал, — это DI (с которым я новичок, поэтому, возможно, я не понимаю это должным образом); Я попытался сделать мой класс User зависимым от IHttpContextAccessor, поскольку большая часть документации указывает на:

Код: Выделить всё

public class User : IIdentity

{
private readonly IHttpContextAccessor _httpContextAccessor;
public User(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
}
и зарегистрируйте его в файле start.cs следующим образом:

Код: Выделить всё

services.AddHttpContextAccessor();
services.AddTransient();
Но это не очень хорошо работает. Когда я пытаюсь создать свой класс User в классе MyResponse:

Код: Выделить всё

var user = new User(); // This doesn't work, as the constructor requires one argument
Конструктору требуется один аргумент, поэтому я не могу создать такой класс. Я считаю, что мне нужно будет создать пользователя из контейнера DI, но у меня нет доступа к этому в классе MyResponse (или, по крайней мере, я не мог понять, как это сделать или, если возможно, вообще).
Я мог бы передать HttpContext от контроллера к MyResponse, но это кажется совершенно неправильным (плюс, может контроллеры пишут другие люди, поэтому я думаю, что лучше, если им не нужно явно передавать это в ответ, это должно обрабатываться прозрачно).
Как я могу получить HttpContext в моем классе специального ответа?

Подробнее здесь: https://stackoverflow.com/questions/679 ... ata-in-asp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»