Использование зависимостей по определенным областям от NServiceBus Behavior - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь использовать Scoped зависимость от NServiceBus Behavior.

От NServiceBus Поведение документы:

Поведения толькосозданный один и тот же экземпляр повторно используется при каждом вызове конвейера.Следовательно, каждая поведенческая зависимость также будет вести себя как одиночка, даже если при регистрации в внедрении зависимости была указана другая опция.Кроме того, поведение и все зависимости, вызываемые во время фазы вызова, должны быть безопасными для параллелизма и, возможно, без сохранения состояния.Следует избегать сохранения состояния в экземпляре поведения, поскольку это приведет к тому, что состояние будет общим для всех сеансов обработки сообщений.Это может привести к нежелательным побочным эффектам.

Поскольку Behavior является синглтоном, а метод Invoke Behavior не позволяет вводить какую-либо зависимость (например, invoke метод промежуточного программного обеспечения сетевого ядра, потому что в данном случае это обычная реализация интерфейса), я не могу использовать здесь зависимость scoped.

Я пытался разрешить свои зависимости в моем Invokeметод для каждого входящего / исходящего сообщения путем передачи IServiceCollection в конструкторе:

private readonly IServiceCollection _services;

public MyIncomingMessageBehavior(IServiceCollection services)
{
    _services = services;
}

public override async Task Invoke(IIncomingLogicalMessageContext context, Func<Task> next)
{
    var myScopedDependency = _services.BuildServiceProvider().GetService<IMyScopedDependency>();
    // always 
}

Но это не работает :

Это потому, что когда вы вводитеIServiceProvider в ваше промежуточное ПО - это «глобальный» провайдер, не ограниченный запросами.Нет запроса, когда ваш конструктор промежуточного программного обеспечения вызывается (промежуточное программное обеспечение создается один раз при запуске), поэтому он не может быть контейнером с областью запроса.

Таким образом, моя зависимая область видимости содержит данные для текущего контекста иЯ хотел бы получить доступ к этим данным из метода Invoke моего Behavior синглтона?

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 02 октября 2018

Вам необходимо создать область видимости перед разрешением зависимости:

private readonly IServiceScopeFactory _scopeFactory;

public MyIncomingMessageBehavior(IServiceScopeFactory scopeFactory)
{
    _scopeFactory = scopeFactory;
}

public override async Task Invoke(IIncomingLogicalMessageContext context, Func<Task> next)
{
    using(var scope = _scopeFactory.CreateScope())
    {
        var myScopedDependency = scope.ServiceProvider.GetService<IMyScopedDependency>();
    }
}

Также обратите внимание, что ваша зависимость удаляется вместе с областью действия.

...