Я хочу использовать DryIoc в своем приложении (ASP.Net Core 2.2).
Я хочу использовать один и тот же экземпляр служб во время выполнения вызова одной службы API. (Во время вызова Http / контекст области).
Если бы это было в ASP.Net WebApi, я бы хотел иметь область действия для каждого контекста http. В документации DryIoc можно использовать AsyncExecutionFlowScopeContext для WebApi.
Но с ASP.Net Core я не совсем понимаю, как использовать и объявлять область действия для запроса.
Мой код основан на этом примере: https://github.com/dadhi/DryIoc/tree/master/samples/DryIoc.AspNetCore.Sample
Если я попытался разрешить службу, объявленную как ScopeService (Reuse.Scoped), у меня возникла проблема: Невозможно разрешить IScopedService IsResolutionCall
из контейнера без прицела.
Для вашей информации, объявление моего контейнера выглядит так:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc()
// Enables controllers to be resolved by DryIoc, OTHERWISE resolved by infrastructure
.AddControllersAsServices();
var container = new Container(rules => rules.With(
propertiesAndFields: request =>
request.ServiceType.Name.EndsWith("Controller")
? PropertiesAndFields.Properties()(request)
: null)
.WithCaptureContainerDisposeStackTrace());
Container = container;
return container.WithDependencyInjectionAdapter(services,
throwIfUnresolved: type => type.Name.EndsWith("Controller"))
// Your registrations are defined in CompositionRoot class
.ConfigureServiceProvider<CompositionRoot>();
}
Для регистрации:
public CompositionRoot(IRegistrator r)
{
r.Register<ISingletonService, SingletonService>(Reuse.Singleton);
r.Register<ITransientService, TransientService>(Reuse.Transient);
r.Register<IScopedService, ScopedService>(Reuse.Scoped);
}
И если я попытаюсь сделать это в одном сервисе:
var myScopedServvie = Container.Resolve<IScopedService>();
У меня есть исключение:
ContainerException: невозможно разрешить IScopedService IsResolutionCall
из контейнера без прицела
с правилами с помощью {CaptureContainerDisposeStackTrace}
with Made = {PropertiesAndFields =}
Итак, мой вопрос: как я могу открыть область для каждого запроса моего API?
Я могу видеть некоторые тесты, где есть:
(var scope = container.OpenScope())
...
Но я не знаю, как использовать этот код в моем приложении.
Спасибо за вашу помощь.