В моем приложении AspNetCore я обрабатываю сообщения, поступающие из очереди. Чтобы обработать сообщение, мне нужно разрешить некоторые службы. Некоторые из этих служб имеют зависимость от ITenantId
, которую я связываю, используя информацию из полученного сообщения. Чтобы решить эту проблему, обработка сообщений начинается с создания дочернего контейнера, который я затем использую для создания IServiceScope , из которого я разрешаю все необходимые зависимости.
Сообщения могут обрабатываться параллельно, поэтому области должны быть изолированы друг от друга.
Я вижу способы создания дочернего контейнера, но я не уверен, что лучше с точки зрения производительности, память chrurn et c:
Вариант A: Каждый раз, когда приходит сообщение, клонируйте коллекцию IServiceCollection в новую коллекцию ServiceCollection и повторно привязывайте ITenantId
в клонированном экземпляре.
Вариант B: при запуске программы создайте неизменную копию коллекции IServiceCollection (используя ImmutableList<ServiceDescriptor>
или ImmutableArray<ServiceDescriptor>
). Каждый раз, когда приходит сообщение, замените ITenantId
(что приводит к новому экземпляру ImmutableList<ServiceDescriptor>
) и вызовите CreateScope()
для нового неизменяемого экземпляра.
В опции A мне не нравится то, что Вся коллекция услуг должна быть клонирована каждый раз, когда приходит сообщение. Я не уверен, что неизменные коллекции в варианте B обрабатывают это более разумно?