DryIoc - ядро ​​ASP.Net - контекст контекста для запроса - PullRequest
0 голосов
/ 04 января 2019

Я хочу использовать 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())
...

Но я не знаю, как использовать этот код в моем приложении.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 16 февраля 2019

Область действия будет автоматически открываться для каждого веб-запроса средой Asp .Net Core, вам не нужно об этом беспокоиться.

Если вы хотите проверить настройку контейнера, то вы можете OpenScope вручную в соответствующем тесте и разрешить из возвращенной области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...