Я пытаюсь найти обходной путь использования нескольких сроков жизни с одним контейнером.
Проблема связана с реализацией InstancePerRequest()
.
Существует приложение, основанное наWebAPI с пользовательским WebHandler, поэтому Autofac не может определить, инициализирован или удален LifetimeScope
.Поэтому я не могу использовать базовый InstancePerRequest()
.Я решил реализовать полу-заказ InstancePerRequest()
в соответствии с Документация Autofac
Регистрация Autofac выглядит следующим образом:
...
private static IContainer Container;
private static void RegisterServices()
{
var builder = new ContainerBuilder();
builder.Register((c, p) => new CustomClass(p.Named<List<int>>("codes"), p.Named<User>("user")))
.InstancePerRequest();
Container = builder.Build();
}
public static ILifetimeScope BeginLifetimeScope()
{
return Container.BeginLifetimeScope(new[] { MatchingScopeLifetimeTags.RequestLifetimeScopeTag });
}
...
MatchingScopeLifetimeTags.RequestLifetimeScopeTag
требуется в Autofac Customсемантика для каждого запроса согласно этой статье (точка 2)
Итак, я вручную создаю LifetimeScope
:
... // AutofacHelper.BeginLifetimeScope() is implemented above
using (var lifetimeScope = AutofacHelper.BeginLifetimeScope())
{
result = InvokeRequest(request.Api, context);
}
...
Проблема в том, что их столько LifetimeScope
как запросы.И область, в которой я нуждаюсь, начинается далеко от кода, где мне нужно получить к нему доступ.Мне нужен доступ к текущей области из любого места.
Я думаю, мне нужно пометить каждые LifetimeScope
HttpContext.Current
, и это будет достаточно уникально, чтобы определить, какую область мне нужно использовать.
Но как мне это сделать?Реализация BeginLifetimeScope()
с параметром new[] { MatchingScopeLifetimeTags.RequestLifetimeScopeTag, HttpContext.Current }
приводит к исключению, так как он не может найти запрошенную область.
Есть ли способ определить, какая область используется в текущем запросе?Например, используя мой собственный уникальный тег?ILifetimeScope
имеет реализацию только для родительских областей.Есть ли причина для того, чтобы не использовать дочерние области, чтобы я мог использовать их в соответствии с HttpContext.Current
?
Любые идеи?
Спасибо!