Можно ли иметь определенный класс запроса для всего пути выполнения? - PullRequest
0 голосов
/ 04 октября 2019

Рассмотрим следующую структуру проекта / класса ASP.NET Core:

Request comes in   
  Middleware
    Controller [calls]
      BusinessLayer
        BusinessRules  
          HelperClasses
            DomainSpecificClass
                etc..

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

Что-то вроде:

// middleware class
public async Task Invoke(HttpContext context) {
   // RequestContext is a made up class
   RequestContext.Referrer = context.Request.Headers["Referer"].ToString();
}

// DomainSpecificClass
private void DoStuff() {
   string referrer = RequestContext.Referrer;
}

Является ли этот типреализации возможно в .NET Core?

1 Ответ

1 голос
/ 05 октября 2019

Вы можете создать класс, который будет предоставлять необходимые данные из «текущего» запроса и зарегистрировать его в DI как «Scoped» - один экземпляр на запрос.

public interface ICurrentRequest
{
    string Referrer();
}

public class CurrentRequest : ICurrentRequest
{
    private readonly IHttpContextAccessor _contextAccessor;

    public CurrentRequest(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public string Referrer()
    {
        return _contextAccessor.HttpContext.Request.Headers["Referer"].ToString();
    }
}

Со встроенным DI ASP.NETРеализация контейнера контейнера как "Scoped"

services.AddHttpContextAccessor(); // Built-in extension method
services.AddScoped<ICurrentRequest, CurrentRequest>();

Использовать его на бизнес-уровне

public class DomainSpecificClass
{
    private readonly ICurrentRequest _currentRequest;

    public DomainSpecificClass(ICurrentRequest currentRequest)
    {
        _currentRequest = currentRequest;
    }

    private void DoStuff() 
    {
        var referrer = _currentRequest.Referrer();
    }
}

ICurrentRequest абстракция может быть объявлена ​​на бизнес-уровне, так что любой хост вашего приложения можетреализовать его, и бизнес-логика не будет зависеть от абстракций Http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...