habralab / garnet-team

Habr Pet-Projects Battle Contest: Group Activity and Rating Network
https://garnet.pet-project.habr.com
MIT License
10 stars 0 forks source link

πŸ› ΠŸΠ»Π°Π²Π°ΡŽΡ‰Π°Ρ ошибка ΠΏΡ€ΠΈ взаимодСйствии с шиной Π΄Π°Π½Π½Ρ‹Ρ… #94

Closed picolino closed 11 months ago

picolino commented 11 months ago

Π¨Π°Π³ΠΈ воспроизвСдСния

        "message": "Cannot access a disposed object.\r\nObject name: 'IServiceProvider'.",
        "stackTrace": "   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException()\r\n   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)\r\n   at SlimMessageBus.Host.Collections.GenericTypeCache`1.ResolveAll(IServiceProvider scope, Type messageType)\r\n   at SlimMessageBus.Host.MessageBusBase.ProducePublish(Object message, String path, IDictionary`2 headers, IServiceProvider currentServiceProvider, CancellationToken cancellationToken)\r\n   at SlimMessageBus.Host.Hybrid.HybridMessageBus.ProducePublish(Object message, String path, IDictionary`2 headers, IServiceProvider currentServiceProvider, CancellationToken cancellationToken)\r\n   at Garnet.Common.Infrastructure.MessageBus.SlimMessageBus.Publish[TMessage](TMessage message) in D:\\garnet-team\\common\\server\\Garnet.Common.Infrastructure\\MessageBus\\SlimMessageBus.cs:line 16\r\n   at Garnet.Teams.Application.Team.Commands.TeamCreateCommand.Execute(CancellationToken ct, TeamCreateArgs args) in D:\\garnet-team\\features\\team\\server\\Garnet.Teams.Application\\Team\\Commands\\TeamCreateCommand.cs:line 41\r\n   at Garnet.Teams.Infrastructure.Api.TeamsMutation.TeamCreate(CancellationToken ct, ClaimsPrincipal claims, TeamCreateInput input) in D:\\garnet-team\\features\\team\\server\\Garnet.Teams.Infrastructure\\Api\\TeamsMutation.cs:line 64\r\n   at HotChocolate.Resolvers.Expressions.ExpressionHelper.AwaitTaskHelper[T](Task`1 task)\r\n   at HotChocolate.Types.Helpers.FieldMiddlewareCompiler.<>c__DisplayClass9_0.<<CreateResolverMiddleware>b__0>d.MoveNext()\r\n--- End of stack trace from previous location ---\r\n   at HotChocolate.Types.MutationConventionTypeInterceptor.<>c__DisplayClass16_0.<<ApplyResultMiddleware>b__1>d.MoveNext()\r\n--- End of stack trace from previous location ---\r\n   at HotChocolate.Execution.Processing.Tasks.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken)\r\n   at HotChocolate.Execution.Processing.Tasks.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken)"

ОТидаСмоС повСдСниС

Ошибки Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ ошибка связана с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ SlimMessageBus (внСшняя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π² качСствС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡˆΠΈΠ½Ρ‹ сообщСний) ΠΏΡ€ΠΈ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ Π² памяти Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ΠΎΠΌ:

https://github.com/zarusz/SlimMessageBus/blob/master/docs/provider_memory.md#blocking-publish

Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ отправляСм сообщСниС Π² ΡˆΠΈΠ½Ρƒ, ΠΎΠ½Π° доТидаСтся Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€ΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

Плюс ΠΊΠΎ всСму, ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠ½ΡΡŒΡŽΠΌΠ΅Ρ€Ρ‹ Π² шинС сообщСний Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Singleton, ΠΈ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ captive-dependencies (ΠΊΠΎΠ³Π΄Π° Singleton-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ зависит ΠΎΡ‚ Scoped-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²):

https://github.com/zarusz/SlimMessageBus/blob/master/docs/provider_memory.md#per-message-di-scope

Ошибка, описанная Π²Ρ‹ΡˆΠ΅, Π²ΠΏΠΎΠ»Π½Π΅ сСбС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ слСдствиСм этих настроСк.

picolino commented 11 months ago

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ возникновСния ошибки

Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΊΡ€Ρ‹Π»Π°ΡΡŒ Π² комплСксной нСсовмСстимости нашСго DI, DI Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ HotChocolate ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ slimMessageBus. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ HotChocolate, Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ Π² стандартный Microsoft DI, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свои Ρ€Π΅Π·ΠΎΠ»Π²Π΅Ρ€Ρ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π°, поставляСмого вмСстС с ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ.

Они ΠΏΡ€ΠΈΠ²Π΅Ρ€ΠΆΠ΅Π½Ρ†Ρ‹ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΎΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ зависимости Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· конструктор (ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅ΠΌ ΠΌΡ‹), Π° Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²: https://chillicream.com/docs/hotchocolate/v12/server/dependency-injection Π’ связи с этим Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ½ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ всС свои Ρ‚ΠΈΠΏΡ‹, относящиСся ΠΊ API GraphQL ΠΊΠ°ΠΊ Singleton'Ρ‹ ΠΈ возмоТности ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρƒ нас просто Π½Π΅Ρ‚.

Вакая ТСсткая привязка ΠΊ рСгистрации Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Ρ…ΠΎΠ΄Π° ΠΊΠ°ΠΊ Singleton Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ SlimMessageBus ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ сбой. Π­Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° создаСт Π½ΠΎΠ²Ρ‹ΠΉ Scope Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ отправляСмый Message Π² ΡˆΠΈΠ½Ρƒ. А послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ очистку (Dispose). Но ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° Ρƒ нас зарСгистрирована ΠΊΠ°ΠΊ Singleton, ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сообщСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° SlimMessageBus Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ скоуп (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ ΠΎΡ‡ΠΈΡ‰Π΅Π½), Π° Π½Π΅ создаст Π½ΠΎΠ²Ρ‹ΠΉ. Π­Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ ошибкС.

РСшСниС простоС. ΠœΡ‹ максимально ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ использованиС DI ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Hot Chocolate. ВсС Ρ‚ΠΈΠΏΡ‹ рСгистрируСм Π² стандартном DI ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΠΈΡ… Scoped. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΡƒΡŽ ΠΈΠ½ΡŒΠ΅ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· конструктор (Π΄Π°ΠΆΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Singleton-зависимостями.

Но для этого придСтся ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΏΠ°Ρ‚ΠΈΡ‚ΡŒ...