Я настроил мой контекст EF сконфигурировано как такКак разрешить Autofac каждого запроса услуги от пользовательского атрибута
b.RegisterAssemblyTypes(webAssembly, coreAssembly)
.Where(t => t.IsAssignableTo<DbContext>())
.InstancePerLifetimeScope();
Я хотел бы использовать его из пользовательского атрибута авторизации, который попадает в базу данных, используя свой контекст EF. Это означает, что нет инъекции конструктора. Я добиться этого с помощью CommonSeviceLocator
var csl = new AutofacServiceLocator(container);
ServiceLocator.SetLocatorProvider(() => csl);
...
var user = await ServiceLocator.Current
.GetInstance<SiteContext>().FindAsync(id);
Я нахожу, что это терпит неудачу с «множеством соединений не поддерживается» ошибок, если браузер выдает два одновременных запросов к маршрутам с помощью этого атрибута , Похоже, это может быть due to what is mentioned in this answer. Я предполагаю, что ServiceLocator
разрешает из области корня, а не из области веб-запроса, и два запроса конфликтуют (либо запрос в изоляции работает нормально).
Это похоже на то, что когда я перехожу на InstancePerRequest()
, я получаю это от любого вызова атрибута.
Autofac.Core.DependencyResolutionException No scope with a Tag matching 'AutofacWebRequest' is visible from the scope in which the instance was requested. This generally indicates that a component registered as per-HTTP request is
being requested by a SingleInstance() component (or a similar scenario.) Under the web integration always request dependencies from the DependencyResolver.Current or ILifetimeScopeProvider.RequestLifetime, never from the container itself.
Так что похоже, может быть ServiceLocator
просто не путь.
Как устранить область запроса SiteContext
изнутри атрибута (используя шаблон сервис-локатор)?
[Стандартные фильтры веб-API - это синглтоны] (http://autofac.readthedocs.org/ru/latest/integration/webapi.html#standard-web-api-filters-are-singletons). Вы можете проверить здесь. –
@ErkanDemirel да, но его не так, как 'ServiceLocator' кэширует ответ, он получает новый по каждому вызову! Я предполагаю, что код фильтра запускается * до того, как * Autofac создает область запроса. –
Он будет получать новый с каждым запросом, но он поделится этим с контроллером в этом запросе. (Я проверял, чтобы убедиться). –