com.wallstop-studios.dxmessaging 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/.github/workflows/format-on-demand.yml +2 -2
  2. package/.github/workflows/json-format-check.yml +1 -1
  3. package/.github/workflows/markdown-json.yml +1 -1
  4. package/.github/workflows/markdownlint.yml +1 -1
  5. package/.github/workflows/npm-publish.yml +1 -1
  6. package/.github/workflows/prettier-autofix.yml +2 -2
  7. package/.github/workflows/yaml-format-lint.yml +1 -1
  8. package/Docs/Advanced.md +26 -1
  9. package/Docs/Comparisons.md +1229 -146
  10. package/Docs/Compatibility.md +27 -0
  11. package/Docs/DesignAndArchitecture.md +41 -34
  12. package/Docs/EmitShorthands.md +34 -0
  13. package/Docs/Helpers.md +1 -1
  14. package/Docs/Index.md +28 -25
  15. package/Docs/Install.md +29 -6
  16. package/Docs/Integrations/Reflex.md +292 -0
  17. package/Docs/Integrations/Reflex.md.meta +7 -0
  18. package/Docs/Integrations/VContainer.md +324 -0
  19. package/Docs/Integrations/VContainer.md.meta +7 -0
  20. package/Docs/Integrations/Zenject.md +333 -0
  21. package/Docs/Integrations/Zenject.md.meta +7 -0
  22. package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
  23. package/Docs/InterceptorsAndOrdering.md +371 -17
  24. package/Docs/ListeningPatterns.md +206 -0
  25. package/Docs/MessageBusProviders.md +496 -0
  26. package/Docs/MessageBusProviders.md.meta +7 -0
  27. package/Docs/MessageTypes.md +27 -0
  28. package/Docs/MigrationGuide.md +45 -0
  29. package/Docs/Patterns.md +286 -0
  30. package/Docs/Performance.md +9 -9
  31. package/Docs/QuickReference.md +31 -0
  32. package/Docs/RuntimeConfiguration.md +407 -0
  33. package/Docs/RuntimeConfiguration.md.meta +7 -0
  34. package/Docs/UnityIntegration.md +3 -1
  35. package/Docs/VisualGuide.md +206 -157
  36. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  37. package/README.md +148 -26
  38. package/Runtime/AssemblyInfo.cs +4 -0
  39. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  40. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  41. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  42. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  43. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  44. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  45. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  46. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  47. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  48. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  49. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  50. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  51. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  52. package/Runtime/Core/MessageHandler.cs +198 -27
  53. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  54. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
  55. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
  56. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
  57. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
  58. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
  59. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
  60. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  61. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
  62. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
  63. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
  64. package/Runtime/Unity/Integrations/Reflex.meta +8 -0
  65. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
  66. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  67. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
  68. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
  69. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
  70. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
  71. package/Runtime/Unity/Integrations/VContainer.meta +8 -0
  72. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
  73. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  74. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
  75. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
  76. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
  77. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
  78. package/Runtime/Unity/Integrations/Zenject.meta +8 -0
  79. package/Runtime/Unity/Integrations.meta +8 -0
  80. package/Runtime/Unity/MessageAwareComponent.cs +102 -0
  81. package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
  82. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
  83. package/Runtime/Unity/MessagingComponent.cs +164 -2
  84. package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
  85. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
  86. package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
  87. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
  88. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
  89. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
  90. package/Samples~/DI/Prefabs.meta +8 -0
  91. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
  92. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
  93. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
  94. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
  95. package/Samples~/DI/Providers.meta +8 -0
  96. package/Samples~/DI/README.md +51 -0
  97. package/Samples~/DI/README.md.meta +7 -0
  98. package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
  99. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
  100. package/Samples~/DI/Reflex.meta +8 -0
  101. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +81 -0
  102. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
  103. package/Samples~/DI/VContainer.meta +8 -0
  104. package/Samples~/DI/Zenject/SampleInstaller.cs +67 -0
  105. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
  106. package/Samples~/DI/Zenject.meta +8 -0
  107. package/Samples~/DI.meta +8 -0
  108. package/Samples~/Mini Combat/README.md +5 -7
  109. package/Samples~/Mini Combat/Walkthrough.md +18 -24
  110. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  111. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  112. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  113. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  114. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  115. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  116. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  117. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  118. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  119. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  120. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  121. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  122. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  123. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  124. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  125. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  126. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  127. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  128. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  129. package/Tests/Runtime/Core/Extensions.meta +8 -0
  130. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  131. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  132. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  133. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  134. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  135. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  136. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  137. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  138. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  139. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  140. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  141. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  142. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  143. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  144. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  145. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  146. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  147. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  148. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  149. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  150. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  151. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  152. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  153. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  154. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  155. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  156. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  157. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  158. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  159. package/Tests/Runtime/Integrations.meta +8 -0
  160. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  161. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  162. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  163. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  164. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  165. package/Tests/Runtime/TestUtilities.meta +9 -0
  166. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  167. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  168. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  169. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  170. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  171. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  172. package/Tests/Runtime/Unity.meta +9 -0
  173. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  174. package/package.json +1 -1
@@ -0,0 +1,38 @@
1
+ namespace DxMessaging.Unity
2
+ {
3
+ using DxMessaging.Core;
4
+ using DxMessaging.Core.MessageBus;
5
+ using UnityEngine;
6
+
7
+ /// <summary>
8
+ /// Serialized provider that always returns the original global message bus created during static initialisation.
9
+ /// </summary>
10
+ /// <remarks>
11
+ /// Unlike <see cref="CurrentGlobalMessageBusProvider"/>, this asset ignores runtime overrides of
12
+ /// <see cref="MessageHandler.MessageBus"/>, making it ideal for debugging or diagnostics scenarios where you need a
13
+ /// stable reference to the startup bus.
14
+ /// </remarks>
15
+ /// <example>
16
+ /// <code>
17
+ /// // Temporarily override the global bus while still keeping a reference to the startup instance.
18
+ /// var initialProvider = Resources.Load<InitialGlobalMessageBusProvider>("InitialGlobalMessageBusProvider");
19
+ /// IMessageBus startupBus = initialProvider.Resolve();
20
+ /// using (MessageHandler.OverrideGlobalMessageBus(customBus))
21
+ /// {
22
+ /// // ... scenario under test
23
+ /// }
24
+ /// // startupBus still references the original global bus
25
+ /// </code>
26
+ /// </summary>
27
+ [CreateAssetMenu(
28
+ fileName = "InitialGlobalMessageBusProvider",
29
+ menuName = "Wallstop Studios/DxMessaging/Message Bus Providers/Initial Global Message Bus"
30
+ )]
31
+ public sealed class InitialGlobalMessageBusProvider : ScriptableMessageBusProvider
32
+ {
33
+ public override IMessageBus Resolve()
34
+ {
35
+ return MessageHandler.InitialGlobalMessageBus;
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,12 @@
1
+ fileFormatVersion: 2
2
+ guid: 1f3f2efbb7f4441ebde8b418d178885a
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
12
+
@@ -0,0 +1,11 @@
1
+ using System.Runtime.CompilerServices;
2
+
3
+ [assembly: InternalsVisibleTo(
4
+ assemblyName: "WallstopStudios.DxMessaging.Tests.Runtime",
5
+ AllInternalsVisible = true
6
+ )]
7
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Editor")]
8
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime")]
9
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Reflex")]
10
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.VContainer")]
11
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Zenject")]
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 978915f0cb9d43d99e46455ff38dc528
3
+ timeCreated: 1761517485
@@ -0,0 +1,73 @@
1
+ namespace DxMessaging.Unity.Integrations.Reflex
2
+ {
3
+ #if REFLEX_PRESENT
4
+ using Core.MessageBus;
5
+ using global::Reflex.Attributes;
6
+ using global::Reflex.Core;
7
+
8
+ /// <summary>
9
+ /// Optional installer that binds <see cref="IMessageRegistrationBuilder"/> for Reflex containers.
10
+ /// </summary>
11
+ public sealed class DxMessagingRegistrationInstaller : IInstaller
12
+ {
13
+ public void InstallBindings(ContainerBuilder containerBuilder)
14
+ {
15
+ containerBuilder.AddSingleton(
16
+ typeof(ContainerMessageRegistrationBuilder),
17
+ typeof(ContainerMessageRegistrationBuilder),
18
+ typeof(IMessageRegistrationBuilder)
19
+ );
20
+ }
21
+
22
+ internal sealed class ContainerMessageRegistrationBuilder : IMessageRegistrationBuilder
23
+ {
24
+ [Inject]
25
+ private Container _container;
26
+
27
+ public MessageRegistrationLease Build(MessageRegistrationBuildOptions options)
28
+ {
29
+ MessageRegistrationBuilder innerBuilder = ResolveInnerBuilder();
30
+ return innerBuilder.Build(options);
31
+ }
32
+
33
+ private MessageRegistrationBuilder ResolveInnerBuilder()
34
+ {
35
+ IMessageBusProvider provider = TryResolveProvider();
36
+ if (provider != null)
37
+ {
38
+ return new MessageRegistrationBuilder(provider);
39
+ }
40
+
41
+ return new MessageRegistrationBuilder(new ContainerMessageBusProvider(_container));
42
+ }
43
+
44
+ private IMessageBusProvider TryResolveProvider()
45
+ {
46
+ try
47
+ {
48
+ return _container.Resolve<IMessageBusProvider>();
49
+ }
50
+ catch
51
+ {
52
+ return null;
53
+ }
54
+ }
55
+ }
56
+
57
+ public sealed class ContainerMessageBusProvider : IMessageBusProvider
58
+ {
59
+ private readonly Container _container;
60
+
61
+ public ContainerMessageBusProvider(Container container)
62
+ {
63
+ _container = container;
64
+ }
65
+
66
+ public IMessageBus Resolve()
67
+ {
68
+ return _container.Resolve<IMessageBus>();
69
+ }
70
+ }
71
+ }
72
+ #endif
73
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 679059e269c44cda9044da10c5640935
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.Reflex",
3
+ "rootNamespace": "DxMessaging.Unity.Integrations.Reflex",
4
+ "references": ["WallstopStudios.DxMessaging", "Reflex", "Reflex.Unity"],
5
+ "includePlatforms": [],
6
+ "excludePlatforms": [],
7
+ "allowUnsafeCode": false,
8
+ "overrideReferences": false,
9
+ "precompiledReferences": [],
10
+ "autoReferenced": true,
11
+ "defineConstraints": ["REFLEX_PRESENT"],
12
+ "versionDefines": [
13
+ {
14
+ "name": "com.gustavopsantos.reflex",
15
+ "expression": "0.0.1",
16
+ "define": "REFLEX_PRESENT"
17
+ }
18
+ ],
19
+ "noEngineReferences": false
20
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 40c54d5b9b8a421f8bdb5674af90b8db
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 1f0fca97d2b2462491078c52ecc0f92a
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,11 @@
1
+ using System.Runtime.CompilerServices;
2
+
3
+ [assembly: InternalsVisibleTo(
4
+ assemblyName: "WallstopStudios.DxMessaging.Tests.Runtime",
5
+ AllInternalsVisible = true
6
+ )]
7
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Editor")]
8
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime")]
9
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Reflex")]
10
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.VContainer")]
11
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Zenject")]
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: c26d8cf1c99e45c0a847404d9a455ed1
3
+ timeCreated: 1761517479
@@ -0,0 +1,46 @@
1
+ namespace DxMessaging.Unity.Integrations.VContainer
2
+ {
3
+ #if VCONTAINER_PRESENT
4
+ using global::VContainer;
5
+ using Core.MessageBus;
6
+
7
+ /// <summary>
8
+ /// Provides convenience extension methods for wiring <see cref="IMessageRegistrationBuilder"/> inside VContainer scopes.
9
+ /// </summary>
10
+ public static class VContainerRegistrationExtensions
11
+ {
12
+ /// <summary>
13
+ /// Registers <see cref="IMessageRegistrationBuilder"/> as a transient service backed by the scoped message bus.
14
+ /// </summary>
15
+ public static void RegisterMessageRegistrationBuilder(this IContainerBuilder builder)
16
+ {
17
+ builder.Register<IMessageRegistrationBuilder>(CreateBuilder, Lifetime.Transient);
18
+ }
19
+
20
+ private static IMessageRegistrationBuilder CreateBuilder(IObjectResolver resolver)
21
+ {
22
+ if (resolver.TryResolve(out IMessageBusProvider provider))
23
+ {
24
+ return new MessageRegistrationBuilder(provider);
25
+ }
26
+
27
+ return new MessageRegistrationBuilder(new ResolverMessageBusProvider(resolver));
28
+ }
29
+
30
+ public sealed class ResolverMessageBusProvider : IMessageBusProvider
31
+ {
32
+ private readonly IObjectResolver _resolver;
33
+
34
+ public ResolverMessageBusProvider(IObjectResolver resolver)
35
+ {
36
+ _resolver = resolver;
37
+ }
38
+
39
+ public IMessageBus Resolve()
40
+ {
41
+ return _resolver.Resolve<IMessageBus>();
42
+ }
43
+ }
44
+ }
45
+ #endif
46
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 494e388075f84aeda9266a0e57f8a05d
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.VContainer",
3
+ "rootNamespace": "DxMessaging.Unity.Integrations.VContainer",
4
+ "references": ["WallstopStudios.DxMessaging", "VContainer", "VContainer.Unity"],
5
+ "includePlatforms": [],
6
+ "excludePlatforms": [],
7
+ "allowUnsafeCode": false,
8
+ "overrideReferences": false,
9
+ "precompiledReferences": [],
10
+ "autoReferenced": true,
11
+ "defineConstraints": ["VCONTAINER_PRESENT"],
12
+ "versionDefines": [
13
+ {
14
+ "name": "jp.cysharp.vcontainer",
15
+ "expression": "0.0.1",
16
+ "define": "VCONTAINER_PRESENT"
17
+ },
18
+ {
19
+ "name": "jp.hadashikick.vcontainer",
20
+ "expression": "0.0.1",
21
+ "define": "VCONTAINER_PRESENT"
22
+ },
23
+ {
24
+ "name": "VContainer",
25
+ "expression": "0.0.1",
26
+ "define": "VCONTAINER_PRESENT"
27
+ }
28
+ ],
29
+ "noEngineReferences": false
30
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 2583d1d4ebd847faba751e3be6bf5b20
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 4d890fb7cb4f49e18fd9fbac12d5040c
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,11 @@
1
+ using System.Runtime.CompilerServices;
2
+
3
+ [assembly: InternalsVisibleTo(
4
+ assemblyName: "WallstopStudios.DxMessaging.Tests.Runtime",
5
+ AllInternalsVisible = true
6
+ )]
7
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Editor")]
8
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime")]
9
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Reflex")]
10
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.VContainer")]
11
+ [assembly: InternalsVisibleTo("WallstopStudios.DxMessaging.Tests.Runtime.Zenject")]
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: ec21f9c7970043fe88177114708ef79e
3
+ timeCreated: 1761517466
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "WallstopStudios.DxMessaging.Zenject",
3
+ "rootNamespace": "DxMessaging.Unity.Integrations.Zenject",
4
+ "references": ["WallstopStudios.DxMessaging", "Zenject"],
5
+ "includePlatforms": [],
6
+ "excludePlatforms": [],
7
+ "allowUnsafeCode": false,
8
+ "overrideReferences": false,
9
+ "precompiledReferences": [],
10
+ "autoReferenced": true,
11
+ "defineConstraints": ["ZENJECT_PRESENT"],
12
+ "versionDefines": [
13
+ {
14
+ "name": "com.extenject.zenject",
15
+ "expression": "0.0.1",
16
+ "define": "ZENJECT_PRESENT"
17
+ },
18
+ {
19
+ "name": "com.modesttree.zenject",
20
+ "expression": "0.0.1",
21
+ "define": "ZENJECT_PRESENT"
22
+ },
23
+ {
24
+ "name": "com.svermeulen.extenject",
25
+ "expression": "0.0.1",
26
+ "define": "ZENJECT_PRESENT"
27
+ }
28
+ ],
29
+ "noEngineReferences": false
30
+ }
@@ -0,0 +1,7 @@
1
+ fileFormatVersion: 2
2
+ guid: 5c2f6b45062a4c07a599dd8bcbac2bb4
3
+ AssemblyDefinitionImporter:
4
+ externalObjects: {}
5
+ userData:
6
+ assetBundleName:
7
+ assetBundleVariant:
@@ -0,0 +1,55 @@
1
+ namespace DxMessaging.Unity.Integrations.Zenject
2
+ {
3
+ #if ZENJECT_PRESENT
4
+ using global::Zenject;
5
+ using Core.MessageBus;
6
+
7
+ /// <summary>
8
+ /// Optional installer that exposes <see cref="IMessageRegistrationBuilder"/> using the scoped Zenject container.
9
+ /// </summary>
10
+ public sealed class DxMessagingRegistrationInstaller : MonoInstaller
11
+ {
12
+ internal void RunInstallBindings(DiContainer container)
13
+ {
14
+ Container = container;
15
+ InstallBindings();
16
+ }
17
+
18
+ public override void InstallBindings()
19
+ {
20
+ Container.Bind<IMessageRegistrationBuilder>().FromMethod(CreateBuilder).AsTransient();
21
+ }
22
+
23
+ private static IMessageRegistrationBuilder CreateBuilder(InjectContext context)
24
+ {
25
+ IMessageBusProvider provider = context.Container.TryResolve<IMessageBusProvider>();
26
+ if (provider != null)
27
+ {
28
+ return new MessageRegistrationBuilder(provider);
29
+ }
30
+
31
+ IMessageBus messageBus = context.Container.Resolve<IMessageBus>();
32
+ return new MessageRegistrationBuilder(
33
+ new ContainerMessageBusProvider(context.Container, messageBus)
34
+ );
35
+ }
36
+
37
+ public sealed class ContainerMessageBusProvider : IMessageBusProvider
38
+ {
39
+ private readonly DiContainer _container;
40
+ private readonly IMessageBus _cachedBus;
41
+
42
+ public ContainerMessageBusProvider(DiContainer container, IMessageBus cachedBus)
43
+ {
44
+ _container = container;
45
+ _cachedBus = cachedBus;
46
+ }
47
+
48
+ public IMessageBus Resolve()
49
+ {
50
+ return _cachedBus ?? _container.Resolve<IMessageBus>();
51
+ }
52
+ }
53
+ }
54
+ #endif
55
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 1f5d2f7d6c9b4bb9bb5d9ce1f2e4763c
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 6f2c8f2b1b0b4f618d4f2711d8f6ac2b
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: d4cc934a94a46b849bd0ce328eba12be
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -1,6 +1,7 @@
1
1
  namespace DxMessaging.Unity
2
2
  {
3
3
  using Core;
4
+ using Core.MessageBus;
4
5
  using Core.Messages;
5
6
  using UnityEngine;
6
7
 
@@ -65,6 +66,9 @@ namespace DxMessaging.Unity
65
66
  protected virtual bool RegisterForStringMessages => true;
66
67
 
67
68
  protected MessagingComponent _messagingComponent;
69
+ protected IMessageBus _configuredMessageBus;
70
+ protected IMessageBusProvider _configuredMessageBusProvider;
71
+ protected MessageBusProviderHandle _configuredMessageBusProviderHandle;
68
72
 
69
73
  /// <summary>
70
74
  /// Creates the <see cref="MessagingComponent"/>, token, and calls <see cref="RegisterMessageHandlers"/>.
@@ -72,6 +76,30 @@ namespace DxMessaging.Unity
72
76
  protected virtual void Awake()
73
77
  {
74
78
  _messagingComponent = GetComponent<MessagingComponent>();
79
+ if (
80
+ _configuredMessageBusProvider == null
81
+ && _configuredMessageBusProviderHandle.TryGetProvider(
82
+ out IMessageBusProvider handleProvider
83
+ )
84
+ )
85
+ {
86
+ _configuredMessageBusProvider = handleProvider;
87
+ }
88
+
89
+ if (_configuredMessageBusProvider != null)
90
+ {
91
+ _messagingComponent.Configure(
92
+ _configuredMessageBusProvider,
93
+ MessageBusRebindMode.PreserveRegistrations
94
+ );
95
+ }
96
+ else if (_configuredMessageBus != null)
97
+ {
98
+ _messagingComponent.Configure(
99
+ _configuredMessageBus,
100
+ MessageBusRebindMode.PreserveRegistrations
101
+ );
102
+ }
75
103
  _messageRegistrationToken = _messagingComponent.Create(this);
76
104
  RegisterMessageHandlers();
77
105
  }
@@ -143,6 +171,80 @@ namespace DxMessaging.Unity
143
171
  // Intentionally left blank
144
172
  }
145
173
 
174
+ /// <summary>
175
+ /// Supplies a custom <see cref="IMessageBus"/> for this component's underlying <see cref="MessageHandler"/>.
176
+ /// </summary>
177
+ /// <param name="messageBus">
178
+ /// Container-managed bus to use. Pass <see langword="null"/> to revert to the global bus
179
+ /// returned by <see cref="MessageHandler.MessageBus"/>.
180
+ /// </param>
181
+ /// <param name="rebindMode">Controls whether existing handlers should migrate to the provided bus immediately.</param>
182
+ /// <remarks>
183
+ /// Call this during dependency injection (before <see cref="Awake"/>) to ensure the token is created against
184
+ /// the provided bus, or invoke it later to retarget existing registrations.
185
+ /// </remarks>
186
+ public virtual void ConfigureMessageBus(
187
+ IMessageBus messageBus,
188
+ MessageBusRebindMode rebindMode
189
+ )
190
+ {
191
+ _configuredMessageBus = messageBus;
192
+ _configuredMessageBusProvider = null;
193
+ _configuredMessageBusProviderHandle = MessageBusProviderHandle.Empty;
194
+ _messagingComponent?.Configure(_configuredMessageBus, rebindMode);
195
+ }
196
+
197
+ /// <summary>
198
+ /// Supplies an <see cref="IMessageBusProvider"/> for this component's underlying <see cref="MessageHandler"/>.
199
+ /// </summary>
200
+ /// <param name="messageBusProvider">Provider used to resolve buses for this component.</param>
201
+ /// <param name="rebindMode">Controls whether existing handlers should migrate to the provided bus immediately.</param>
202
+ public virtual void ConfigureMessageBus(
203
+ IMessageBusProvider messageBusProvider,
204
+ MessageBusRebindMode rebindMode
205
+ )
206
+ {
207
+ _configuredMessageBusProvider = messageBusProvider;
208
+ if (messageBusProvider != null)
209
+ {
210
+ _configuredMessageBus = null;
211
+ _configuredMessageBusProviderHandle = MessageBusProviderHandle.FromProvider(
212
+ messageBusProvider
213
+ );
214
+ }
215
+ else
216
+ {
217
+ _configuredMessageBusProviderHandle = MessageBusProviderHandle.Empty;
218
+ }
219
+
220
+ _messagingComponent?.Configure(_configuredMessageBusProvider, rebindMode);
221
+ }
222
+
223
+ /// <summary>
224
+ /// Supplies a serialized handle that resolves an <see cref="IMessageBusProvider"/>.
225
+ /// </summary>
226
+ /// <param name="providerHandle">Handle referencing the provider.</param>
227
+ /// <param name="rebindMode">Controls whether existing handlers should migrate to the provided bus immediately.</param>
228
+ public virtual void ConfigureMessageBus(
229
+ MessageBusProviderHandle providerHandle,
230
+ MessageBusRebindMode rebindMode
231
+ )
232
+ {
233
+ _configuredMessageBusProviderHandle = providerHandle;
234
+ if (providerHandle.TryGetProvider(out IMessageBusProvider provider))
235
+ {
236
+ _configuredMessageBusProvider = provider;
237
+ _configuredMessageBus = null;
238
+ }
239
+ else
240
+ {
241
+ _configuredMessageBusProvider = null;
242
+ _configuredMessageBusProviderHandle = MessageBusProviderHandle.Empty;
243
+ }
244
+
245
+ _messagingComponent?.Configure(providerHandle, rebindMode);
246
+ }
247
+
146
248
  /// <summary>
147
249
  /// Demo handler: targeted string message to this GameObject.
148
250
  /// Override to implement behavior.