Вы можете создать класс, который будет предоставлять необходимые данные из «текущего» запроса и зарегистрировать его в 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.