Внедрение зависимостей следует настраивать не во время выполнения для каждого запроса, а при запуске приложения для всего приложения.
Для экземпляров по запросу лучше использовать данные запроса с использованием HttpContext.Items
. Это хранилище Key-Value, предназначенное для общих объектов в рамках одного HTTP-запроса.
В вашем промежуточном программном обеспечении вы можете добавить объект в коллекцию HttpContext.Items
:
context.Items.Add("someObjectKey", someObject);
Затем в контроллере (или в любом месте, где у вас есть HttpContext), вы можете получить объект:
if (context.Items.TryGetValue("someObjectKey", out object objSomeObject)
&& objSomeObject is SomeObjectType someObject)) {
// Do anything with your object here
}
Если вы действительно хотите использовать DI, вы можете создать вспомогательный класс с ограниченным временем жизни, который получает текущий HttpContext
с IHttpContextAccessor
и предлагает ваш объект безопасным для типов способом.
public class SomeObjectAccessor
{
private readonly IHttpContextAccessor _httpContextAccessor;
public SomeObjectAccessor(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public SomeObject Object {
get
{
if (_httpContextAccessor.HttpContext?.Items != null && _httpContextAccessor.HttpContext.Items.TryGetValue("someObjectKey", out object objSomeObject))
return objSomeObject as SomeObject;
return null;
}
}
}
В качестве альтернативы этот класс может также действовать как фабрика и создавать объекты на основе HttpContext при первом доступе, тогда вы не будете использовать HttpContext.Items
. Но это зависит от варианта использования здесь.