Я пытаюсь использовать 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
синглтона?
Есть ли способ сделать это?