com.wallstop-studios.dxmessaging 2.0.0 → 2.1.1

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 (183) 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 +91 -76
  14. package/Docs/Index.md +28 -25
  15. package/Docs/Install.md +29 -6
  16. package/Docs/Integrations/Reflex.md +292 -0
  17. package/{package-lock.json.meta → Docs/Integrations/Reflex.md.meta} +1 -1
  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/QuickStart.md +1 -2
  33. package/Docs/RuntimeConfiguration.md +407 -0
  34. package/Docs/RuntimeConfiguration.md.meta +7 -0
  35. package/Docs/UnityIntegration.md +3 -1
  36. package/Docs/VisualGuide.md +206 -157
  37. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  38. package/README.md +148 -26
  39. package/Runtime/AssemblyInfo.cs +4 -0
  40. package/Runtime/Core/Attributes/DxAutoConstructorAttribute.cs +1 -1
  41. package/Runtime/Core/Attributes/DxBroadcastMessageAttribute.cs +1 -1
  42. package/Runtime/Core/Attributes/DxOptionalParameterAttribute.cs +1 -1
  43. package/Runtime/Core/Attributes/DxTargetedMessageAttribute.cs +1 -1
  44. package/Runtime/Core/Attributes/DxUntargetedMessageAttribute.cs +1 -1
  45. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  46. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  47. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  48. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  49. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  50. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  51. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  52. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  53. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  54. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  55. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  56. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  57. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  58. package/Runtime/Core/MessageHandler.cs +198 -27
  59. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  60. package/Runtime/Core/Messages/IBroadcastMessage.cs +1 -1
  61. package/Runtime/Core/Messages/ITargetedMessage.cs +1 -1
  62. package/Runtime/Core/Messages/IUntargetedMessage.cs +1 -1
  63. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
  64. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
  65. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
  66. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
  67. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
  68. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
  69. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  70. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
  71. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
  72. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
  73. package/Runtime/Unity/Integrations/Reflex.meta +8 -0
  74. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
  75. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  76. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
  77. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
  78. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
  79. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
  80. package/Runtime/Unity/Integrations/VContainer.meta +8 -0
  81. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
  82. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  83. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
  84. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
  85. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
  86. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
  87. package/Runtime/Unity/Integrations/Zenject.meta +8 -0
  88. package/Runtime/Unity/Integrations.meta +8 -0
  89. package/Runtime/Unity/MessageAwareComponent.cs +102 -0
  90. package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
  91. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
  92. package/Runtime/Unity/MessagingComponent.cs +175 -9
  93. package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
  94. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
  95. package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
  96. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
  97. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
  98. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
  99. package/Samples~/DI/Prefabs.meta +8 -0
  100. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
  101. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
  102. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
  103. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
  104. package/Samples~/DI/Providers.meta +8 -0
  105. package/Samples~/DI/README.md +51 -0
  106. package/Samples~/DI/README.md.meta +7 -0
  107. package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
  108. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
  109. package/Samples~/DI/Reflex.meta +8 -0
  110. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +79 -0
  111. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
  112. package/Samples~/DI/VContainer.meta +8 -0
  113. package/Samples~/DI/Zenject/SampleInstaller.cs +65 -0
  114. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
  115. package/Samples~/DI/Zenject.meta +8 -0
  116. package/Samples~/DI.meta +8 -0
  117. package/Samples~/Mini Combat/README.md +5 -7
  118. package/Samples~/Mini Combat/Walkthrough.md +18 -24
  119. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  120. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  121. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  122. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  123. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  124. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  125. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  126. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  127. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  128. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  129. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  130. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  131. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  132. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  133. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  134. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  135. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  136. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  137. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  138. package/Tests/Runtime/Core/Extensions.meta +8 -0
  139. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  140. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  141. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  142. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  143. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  144. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  145. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  146. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  147. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  148. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  149. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  150. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  151. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  152. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  153. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  154. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  155. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  156. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  157. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  158. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  159. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  160. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  161. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  162. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  163. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  164. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  165. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  166. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  167. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  168. package/Tests/Runtime/Integrations.meta +8 -0
  169. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  170. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  171. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  172. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  173. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  174. package/Tests/Runtime/TestUtilities.meta +9 -0
  175. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  176. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  177. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  178. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  179. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  180. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  181. package/Tests/Runtime/Unity.meta +9 -0
  182. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  183. package/package.json +1 -1
@@ -47,19 +47,20 @@ namespace DxMessaging.Core.Extensions
47
47
  public static void EmitGameObjectTargeted<TMessage>(
48
48
  this TMessage message,
49
49
  UnityEngine.GameObject target,
50
- IMessageBus messageBus = null
50
+ IMessageBus messageBus = null,
51
+ IMessageBusProvider messageBusProvider = null
51
52
  )
52
53
  where TMessage : class, ITargetedMessage
53
54
  {
54
55
  InstanceId targetId = target;
55
- messageBus ??= MessageHandler.MessageBus;
56
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
56
57
  if (typeof(TMessage) == typeof(ITargetedMessage))
57
58
  {
58
- messageBus.UntypedTargetedBroadcast(targetId, message);
59
+ resolvedBus.UntypedTargetedBroadcast(targetId, message);
59
60
  return;
60
61
  }
61
62
 
62
- messageBus.TargetedBroadcast(ref targetId, ref message);
63
+ resolvedBus.TargetedBroadcast(ref targetId, ref message);
63
64
  }
64
65
 
65
66
  /// <summary>
@@ -71,19 +72,20 @@ namespace DxMessaging.Core.Extensions
71
72
  public static void EmitGameObjectTargeted<TMessage>(
72
73
  this ref TMessage message,
73
74
  UnityEngine.GameObject target,
74
- IMessageBus messageBus = null
75
+ IMessageBus messageBus = null,
76
+ IMessageBusProvider messageBusProvider = null
75
77
  )
76
78
  where TMessage : struct, ITargetedMessage
77
79
  {
78
80
  InstanceId targetId = target;
79
- messageBus ??= MessageHandler.MessageBus;
81
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
80
82
  if (typeof(TMessage) == typeof(ITargetedMessage))
81
83
  {
82
- messageBus.UntypedTargetedBroadcast(targetId, message);
84
+ resolvedBus.UntypedTargetedBroadcast(targetId, message);
83
85
  return;
84
86
  }
85
87
 
86
- messageBus.TargetedBroadcast(ref targetId, ref message);
88
+ resolvedBus.TargetedBroadcast(ref targetId, ref message);
87
89
  }
88
90
 
89
91
  /// <summary>
@@ -95,19 +97,20 @@ namespace DxMessaging.Core.Extensions
95
97
  public static void EmitComponentTargeted<TMessage>(
96
98
  this TMessage message,
97
99
  UnityEngine.Component target,
98
- IMessageBus messageBus = null
100
+ IMessageBus messageBus = null,
101
+ IMessageBusProvider messageBusProvider = null
99
102
  )
100
103
  where TMessage : class, ITargetedMessage
101
104
  {
102
105
  InstanceId targetId = target;
103
- messageBus ??= MessageHandler.MessageBus;
106
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
104
107
  if (typeof(TMessage) == typeof(ITargetedMessage))
105
108
  {
106
- messageBus.UntypedTargetedBroadcast(targetId, message);
109
+ resolvedBus.UntypedTargetedBroadcast(targetId, message);
107
110
  return;
108
111
  }
109
112
 
110
- messageBus.TargetedBroadcast(ref targetId, ref message);
113
+ resolvedBus.TargetedBroadcast(ref targetId, ref message);
111
114
  }
112
115
 
113
116
  /// <summary>
@@ -119,19 +122,20 @@ namespace DxMessaging.Core.Extensions
119
122
  public static void EmitComponentTargeted<TMessage>(
120
123
  this ref TMessage message,
121
124
  UnityEngine.Component target,
122
- IMessageBus messageBus = null
125
+ IMessageBus messageBus = null,
126
+ IMessageBusProvider messageBusProvider = null
123
127
  )
124
128
  where TMessage : struct, ITargetedMessage
125
129
  {
126
130
  InstanceId targetId = target;
127
- messageBus ??= MessageHandler.MessageBus;
131
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
128
132
  if (typeof(TMessage) == typeof(ITargetedMessage))
129
133
  {
130
- messageBus.UntypedTargetedBroadcast(targetId, message);
134
+ resolvedBus.UntypedTargetedBroadcast(targetId, message);
131
135
  return;
132
136
  }
133
137
 
134
- messageBus.TargetedBroadcast(ref targetId, ref message);
138
+ resolvedBus.TargetedBroadcast(ref targetId, ref message);
135
139
  }
136
140
  #endif
137
141
 
@@ -144,18 +148,19 @@ namespace DxMessaging.Core.Extensions
144
148
  public static void EmitTargeted<TMessage>(
145
149
  this TMessage message,
146
150
  InstanceId target,
147
- IMessageBus messageBus = null
151
+ IMessageBus messageBus = null,
152
+ IMessageBusProvider messageBusProvider = null
148
153
  )
149
154
  where TMessage : class, ITargetedMessage
150
155
  {
151
- messageBus ??= MessageHandler.MessageBus;
156
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
152
157
  if (typeof(TMessage) == typeof(ITargetedMessage))
153
158
  {
154
- messageBus.UntypedTargetedBroadcast(target, message);
159
+ resolvedBus.UntypedTargetedBroadcast(target, message);
155
160
  return;
156
161
  }
157
162
 
158
- messageBus.TargetedBroadcast(ref target, ref message);
163
+ resolvedBus.TargetedBroadcast(ref target, ref message);
159
164
  }
160
165
 
161
166
  /// <summary>
@@ -167,18 +172,19 @@ namespace DxMessaging.Core.Extensions
167
172
  public static void EmitTargeted<TMessage>(
168
173
  this ref TMessage message,
169
174
  InstanceId target,
170
- IMessageBus messageBus = null
175
+ IMessageBus messageBus = null,
176
+ IMessageBusProvider messageBusProvider = null
171
177
  )
172
178
  where TMessage : struct, ITargetedMessage
173
179
  {
174
- messageBus ??= MessageHandler.MessageBus;
180
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
175
181
  if (typeof(TMessage) == typeof(ITargetedMessage))
176
182
  {
177
- messageBus.UntypedTargetedBroadcast(target, message);
183
+ resolvedBus.UntypedTargetedBroadcast(target, message);
178
184
  return;
179
185
  }
180
186
 
181
- messageBus.TargetedBroadcast(ref target, ref message);
187
+ resolvedBus.TargetedBroadcast(ref target, ref message);
182
188
  }
183
189
 
184
190
  /// <summary>
@@ -188,18 +194,19 @@ namespace DxMessaging.Core.Extensions
188
194
  /// <param name="messageBus">MessageBus to emit to. If null, uses the GlobalMessageBus.</param>
189
195
  public static void EmitUntargeted<TMessage>(
190
196
  this TMessage message,
191
- IMessageBus messageBus = null
197
+ IMessageBus messageBus = null,
198
+ IMessageBusProvider messageBusProvider = null
192
199
  )
193
200
  where TMessage : class, IUntargetedMessage
194
201
  {
195
- messageBus ??= MessageHandler.MessageBus;
202
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
196
203
  if (typeof(TMessage) == typeof(IUntargetedMessage))
197
204
  {
198
- messageBus.UntypedUntargetedBroadcast(message);
205
+ resolvedBus.UntypedUntargetedBroadcast(message);
199
206
  return;
200
207
  }
201
208
 
202
- messageBus.UntargetedBroadcast(ref message);
209
+ resolvedBus.UntargetedBroadcast(ref message);
203
210
  }
204
211
 
205
212
  /// <summary>
@@ -222,17 +229,21 @@ namespace DxMessaging.Core.Extensions
222
229
  /// </example>
223
230
  /// <param name="message">Untargeted message to emit.</param>
224
231
  /// <param name="messageBus">MessageBus to emit to. If null, uses the GlobalMessageBus.</param>
225
- public static void Emit<TMessage>(this TMessage message, IMessageBus messageBus = null)
232
+ public static void Emit<TMessage>(
233
+ this TMessage message,
234
+ IMessageBus messageBus = null,
235
+ IMessageBusProvider messageBusProvider = null
236
+ )
226
237
  where TMessage : class, IUntargetedMessage
227
238
  {
228
- messageBus ??= MessageHandler.MessageBus;
239
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
229
240
  if (typeof(TMessage) == typeof(IUntargetedMessage))
230
241
  {
231
- messageBus.UntypedUntargetedBroadcast(message);
242
+ resolvedBus.UntypedUntargetedBroadcast(message);
232
243
  return;
233
244
  }
234
245
 
235
- messageBus.UntargetedBroadcast(ref message);
246
+ resolvedBus.UntargetedBroadcast(ref message);
236
247
  }
237
248
 
238
249
  /// <summary>
@@ -242,18 +253,19 @@ namespace DxMessaging.Core.Extensions
242
253
  /// <param name="messageBus">MessageBus to emit to. If null, uses the GlobalMessageBus.</param>
243
254
  public static void EmitUntargeted<TMessage>(
244
255
  this ref TMessage message,
245
- IMessageBus messageBus = null
256
+ IMessageBus messageBus = null,
257
+ IMessageBusProvider messageBusProvider = null
246
258
  )
247
259
  where TMessage : struct, IUntargetedMessage
248
260
  {
249
- messageBus ??= MessageHandler.MessageBus;
261
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
250
262
  if (typeof(TMessage) == typeof(IUntargetedMessage))
251
263
  {
252
- messageBus.UntypedUntargetedBroadcast(message);
264
+ resolvedBus.UntypedUntargetedBroadcast(message);
253
265
  return;
254
266
  }
255
267
 
256
- messageBus.UntargetedBroadcast(ref message);
268
+ resolvedBus.UntargetedBroadcast(ref message);
257
269
  }
258
270
 
259
271
  /// <summary>
@@ -276,17 +288,21 @@ namespace DxMessaging.Core.Extensions
276
288
  /// </example>
277
289
  /// <param name="message">Untargeted message to emit.</param>
278
290
  /// <param name="messageBus">MessageBus to emit to. If null, uses the GlobalMessageBus.</param>
279
- public static void Emit<TMessage>(this ref TMessage message, IMessageBus messageBus = null)
291
+ public static void Emit<TMessage>(
292
+ this ref TMessage message,
293
+ IMessageBus messageBus = null,
294
+ IMessageBusProvider messageBusProvider = null
295
+ )
280
296
  where TMessage : struct, IUntargetedMessage
281
297
  {
282
- messageBus ??= MessageHandler.MessageBus;
298
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
283
299
  if (typeof(TMessage) == typeof(IUntargetedMessage))
284
300
  {
285
- messageBus.UntypedUntargetedBroadcast(message);
301
+ resolvedBus.UntypedUntargetedBroadcast(message);
286
302
  return;
287
303
  }
288
304
 
289
- messageBus.UntargetedBroadcast(ref message);
305
+ resolvedBus.UntargetedBroadcast(ref message);
290
306
  }
291
307
 
292
308
  /// <summary>
@@ -319,18 +335,19 @@ namespace DxMessaging.Core.Extensions
319
335
  public static void EmitAt<TMessage>(
320
336
  this ref TMessage message,
321
337
  InstanceId target,
322
- IMessageBus messageBus = null
338
+ IMessageBus messageBus = null,
339
+ IMessageBusProvider messageBusProvider = null
323
340
  )
324
341
  where TMessage : struct, ITargetedMessage
325
342
  {
326
- messageBus ??= MessageHandler.MessageBus;
343
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
327
344
  if (typeof(TMessage) == typeof(ITargetedMessage))
328
345
  {
329
- messageBus.UntypedTargetedBroadcast(target, message);
346
+ resolvedBus.UntypedTargetedBroadcast(target, message);
330
347
  return;
331
348
  }
332
349
 
333
- messageBus.TargetedBroadcast(ref target, ref message);
350
+ resolvedBus.TargetedBroadcast(ref target, ref message);
334
351
  }
335
352
 
336
353
  /// <summary>
@@ -363,18 +380,19 @@ namespace DxMessaging.Core.Extensions
363
380
  public static void EmitFrom<TMessage>(
364
381
  this ref TMessage message,
365
382
  InstanceId source,
366
- IMessageBus messageBus = null
383
+ IMessageBus messageBus = null,
384
+ IMessageBusProvider messageBusProvider = null
367
385
  )
368
386
  where TMessage : struct, IBroadcastMessage
369
387
  {
370
- messageBus ??= MessageHandler.MessageBus;
388
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
371
389
  if (typeof(TMessage) == typeof(ITargetedMessage))
372
390
  {
373
- messageBus.UntypedSourcedBroadcast(source, message);
391
+ resolvedBus.UntypedSourcedBroadcast(source, message);
374
392
  return;
375
393
  }
376
394
 
377
- messageBus.SourcedBroadcast(ref source, ref message);
395
+ resolvedBus.SourcedBroadcast(ref source, ref message);
378
396
  }
379
397
 
380
398
  #if UNITY_2017_1_OR_NEWER
@@ -387,19 +405,20 @@ namespace DxMessaging.Core.Extensions
387
405
  public static void EmitGameObjectBroadcast<TMessage>(
388
406
  this TMessage message,
389
407
  UnityEngine.GameObject source,
390
- IMessageBus messageBus = null
408
+ IMessageBus messageBus = null,
409
+ IMessageBusProvider messageBusProvider = null
391
410
  )
392
411
  where TMessage : class, IBroadcastMessage
393
412
  {
394
413
  InstanceId sourceId = source;
395
- messageBus ??= MessageHandler.MessageBus;
414
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
396
415
  if (typeof(TMessage) == typeof(IBroadcastMessage))
397
416
  {
398
- messageBus.UntypedSourcedBroadcast(sourceId, message);
417
+ resolvedBus.UntypedSourcedBroadcast(sourceId, message);
399
418
  return;
400
419
  }
401
420
 
402
- messageBus.SourcedBroadcast(ref sourceId, ref message);
421
+ resolvedBus.SourcedBroadcast(ref sourceId, ref message);
403
422
  }
404
423
 
405
424
  /// <summary>
@@ -411,19 +430,20 @@ namespace DxMessaging.Core.Extensions
411
430
  public static void EmitGameObjectBroadcast<TMessage>(
412
431
  this ref TMessage message,
413
432
  UnityEngine.GameObject source,
414
- IMessageBus messageBus = null
433
+ IMessageBus messageBus = null,
434
+ IMessageBusProvider messageBusProvider = null
415
435
  )
416
436
  where TMessage : struct, IBroadcastMessage
417
437
  {
418
438
  InstanceId sourceId = source;
419
- messageBus ??= MessageHandler.MessageBus;
439
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
420
440
  if (typeof(TMessage) == typeof(IBroadcastMessage))
421
441
  {
422
- messageBus.UntypedSourcedBroadcast(sourceId, message);
442
+ resolvedBus.UntypedSourcedBroadcast(sourceId, message);
423
443
  return;
424
444
  }
425
445
 
426
- messageBus.SourcedBroadcast(ref sourceId, ref message);
446
+ resolvedBus.SourcedBroadcast(ref sourceId, ref message);
427
447
  }
428
448
 
429
449
  /// <summary>
@@ -435,19 +455,20 @@ namespace DxMessaging.Core.Extensions
435
455
  public static void EmitComponentBroadcast<TMessage>(
436
456
  this TMessage message,
437
457
  UnityEngine.Component source,
438
- IMessageBus messageBus = null
458
+ IMessageBus messageBus = null,
459
+ IMessageBusProvider messageBusProvider = null
439
460
  )
440
461
  where TMessage : class, IBroadcastMessage
441
462
  {
442
463
  InstanceId sourceId = source;
443
- messageBus ??= MessageHandler.MessageBus;
464
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
444
465
  if (typeof(TMessage) == typeof(IBroadcastMessage))
445
466
  {
446
- messageBus.UntypedSourcedBroadcast(sourceId, message);
467
+ resolvedBus.UntypedSourcedBroadcast(sourceId, message);
447
468
  return;
448
469
  }
449
470
 
450
- messageBus.SourcedBroadcast(ref sourceId, ref message);
471
+ resolvedBus.SourcedBroadcast(ref sourceId, ref message);
451
472
  }
452
473
 
453
474
  /// <summary>
@@ -459,19 +480,20 @@ namespace DxMessaging.Core.Extensions
459
480
  public static void EmitComponentBroadcast<TMessage>(
460
481
  this ref TMessage message,
461
482
  UnityEngine.Component source,
462
- IMessageBus messageBus = null
483
+ IMessageBus messageBus = null,
484
+ IMessageBusProvider messageBusProvider = null
463
485
  )
464
486
  where TMessage : struct, IBroadcastMessage
465
487
  {
466
488
  InstanceId sourceId = source;
467
- messageBus ??= MessageHandler.MessageBus;
489
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
468
490
  if (typeof(TMessage) == typeof(IBroadcastMessage))
469
491
  {
470
- messageBus.UntypedSourcedBroadcast(sourceId, message);
492
+ resolvedBus.UntypedSourcedBroadcast(sourceId, message);
471
493
  return;
472
494
  }
473
495
 
474
- messageBus.SourcedBroadcast(ref sourceId, ref message);
496
+ resolvedBus.SourcedBroadcast(ref sourceId, ref message);
475
497
  }
476
498
  #endif
477
499
 
@@ -484,18 +506,19 @@ namespace DxMessaging.Core.Extensions
484
506
  public static void EmitBroadcast<TMessage>(
485
507
  this TMessage message,
486
508
  InstanceId source,
487
- IMessageBus messageBus = null
509
+ IMessageBus messageBus = null,
510
+ IMessageBusProvider messageBusProvider = null
488
511
  )
489
512
  where TMessage : class, IBroadcastMessage
490
513
  {
491
- messageBus ??= MessageHandler.MessageBus;
514
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
492
515
  if (typeof(TMessage) == typeof(IBroadcastMessage))
493
516
  {
494
- messageBus.UntypedSourcedBroadcast(source, message);
517
+ resolvedBus.UntypedSourcedBroadcast(source, message);
495
518
  return;
496
519
  }
497
520
 
498
- messageBus.SourcedBroadcast(ref source, ref message);
521
+ resolvedBus.SourcedBroadcast(ref source, ref message);
499
522
  }
500
523
 
501
524
  /// <summary>
@@ -507,18 +530,19 @@ namespace DxMessaging.Core.Extensions
507
530
  public static void EmitBroadcast<TMessage>(
508
531
  this ref TMessage message,
509
532
  InstanceId source,
510
- IMessageBus messageBus = null
533
+ IMessageBus messageBus = null,
534
+ IMessageBusProvider messageBusProvider = null
511
535
  )
512
536
  where TMessage : struct, IBroadcastMessage
513
537
  {
514
- messageBus ??= MessageHandler.MessageBus;
538
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
515
539
  if (typeof(TMessage) == typeof(IBroadcastMessage))
516
540
  {
517
- messageBus.UntypedSourcedBroadcast(source, message);
541
+ resolvedBus.UntypedSourcedBroadcast(source, message);
518
542
  return;
519
543
  }
520
544
 
521
- messageBus.SourcedBroadcast(ref source, ref message);
545
+ resolvedBus.SourcedBroadcast(ref source, ref message);
522
546
  }
523
547
 
524
548
  /// <summary>
@@ -535,14 +559,13 @@ namespace DxMessaging.Core.Extensions
535
559
  public static void Emit(
536
560
  this string message,
537
561
  InstanceId target,
538
- IMessageBus messageBus = null
562
+ IMessageBus messageBus = null,
563
+ IMessageBusProvider messageBusProvider = null
539
564
  )
540
565
  {
541
566
  StringMessage stringMessage = new(message);
542
- (messageBus ?? MessageHandler.MessageBus).TargetedBroadcast(
543
- ref target,
544
- ref stringMessage
545
- );
567
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
568
+ resolvedBus.TargetedBroadcast(ref target, ref stringMessage);
546
569
  }
547
570
 
548
571
  /// <summary>
@@ -560,14 +583,13 @@ namespace DxMessaging.Core.Extensions
560
583
  public static void EmitAt(
561
584
  this string message,
562
585
  InstanceId target,
563
- IMessageBus messageBus = null
586
+ IMessageBus messageBus = null,
587
+ IMessageBusProvider messageBusProvider = null
564
588
  )
565
589
  {
566
590
  StringMessage stringMessage = new(message);
567
- (messageBus ?? MessageHandler.MessageBus).TargetedBroadcast(
568
- ref target,
569
- ref stringMessage
570
- );
591
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
592
+ resolvedBus.TargetedBroadcast(ref target, ref stringMessage);
571
593
  }
572
594
 
573
595
  /// <summary>
@@ -579,10 +601,15 @@ namespace DxMessaging.Core.Extensions
579
601
  /// </remarks>
580
602
  /// <param name="message">Message to send globally.</param>
581
603
  /// <param name="messageBus">MessageBus to emit to. If null, uses the GlobalMessageBus.</param>
582
- public static void Emit(this string message, IMessageBus messageBus = null)
604
+ public static void Emit(
605
+ this string message,
606
+ IMessageBus messageBus = null,
607
+ IMessageBusProvider messageBusProvider = null
608
+ )
583
609
  {
584
610
  GlobalStringMessage stringMessage = new(message);
585
- (messageBus ?? MessageHandler.MessageBus).UntargetedBroadcast(ref stringMessage);
611
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
612
+ resolvedBus.UntargetedBroadcast(ref stringMessage);
586
613
  }
587
614
 
588
615
  /// <summary>
@@ -602,14 +629,35 @@ namespace DxMessaging.Core.Extensions
602
629
  public static void EmitFrom(
603
630
  this string message,
604
631
  InstanceId source,
605
- IMessageBus messageBus = null
632
+ IMessageBus messageBus = null,
633
+ IMessageBusProvider messageBusProvider = null
606
634
  )
607
635
  {
608
636
  SourcedStringMessage stringMessage = new(message);
609
- (messageBus ?? MessageHandler.MessageBus).SourcedBroadcast(
610
- ref source,
611
- ref stringMessage
612
- );
637
+ IMessageBus resolvedBus = ResolveMessageBus(messageBus, messageBusProvider);
638
+ resolvedBus.SourcedBroadcast(ref source, ref stringMessage);
639
+ }
640
+
641
+ private static IMessageBus ResolveMessageBus(
642
+ IMessageBus explicitBus,
643
+ IMessageBusProvider messageBusProvider
644
+ )
645
+ {
646
+ if (explicitBus != null)
647
+ {
648
+ return explicitBus;
649
+ }
650
+
651
+ if (messageBusProvider != null)
652
+ {
653
+ IMessageBus providedBus = messageBusProvider.Resolve();
654
+ if (providedBus != null)
655
+ {
656
+ return providedBus;
657
+ }
658
+ }
659
+
660
+ return MessageHandler.MessageBus;
613
661
  }
614
662
  }
615
663
  }
@@ -0,0 +1,23 @@
1
+ namespace DxMessaging.Core.MessageBus
2
+ {
3
+ using DxMessaging.Core;
4
+
5
+ /// <summary>
6
+ /// Default provider that returns the process-wide <see cref="MessageHandler.MessageBus"/>.
7
+ /// </summary>
8
+ public sealed class GlobalMessageBusProvider : IMessageBusProvider
9
+ {
10
+ /// <summary>
11
+ /// Shared instance to avoid repeated allocations when consumers need a provider.
12
+ /// </summary>
13
+ public static GlobalMessageBusProvider Instance { get; } = new();
14
+
15
+ private GlobalMessageBusProvider() { }
16
+
17
+ /// <inheritdoc />
18
+ public IMessageBus Resolve()
19
+ {
20
+ return MessageHandler.MessageBus;
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 45218d07f193b154a9aa56435fcbb83d
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,14 @@
1
+ namespace DxMessaging.Core.MessageBus
2
+ {
3
+ /// <summary>
4
+ /// Provides an <see cref="IMessageBus"/> instance for DI-friendly scenarios.
5
+ /// </summary>
6
+ public interface IMessageBusProvider
7
+ {
8
+ /// <summary>
9
+ /// Resolves the <see cref="IMessageBus"/> that should be used for the current context.
10
+ /// </summary>
11
+ /// <returns>The resolved message bus, or <see langword="null"/> to defer to fallbacks.</returns>
12
+ IMessageBus Resolve();
13
+ }
14
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 699419816064e4848a91186b632469d9
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,18 @@
1
+ namespace DxMessaging.Core.MessageBus
2
+ {
3
+ using System;
4
+
5
+ /// <summary>
6
+ /// Factory abstraction that creates <see cref="MessageRegistrationToken"/> lifetimes bound to a resolved message bus.
7
+ /// </summary>
8
+ public interface IMessageRegistrationBuilder
9
+ {
10
+ /// <summary>
11
+ /// Creates a <see cref="MessageRegistrationLease"/> according to the supplied <paramref name="options"/>.
12
+ /// </summary>
13
+ /// <param name="options">Build configuration describing ownership, message bus preference, and lifecycle hooks.</param>
14
+ /// <returns>Lease that exposes the constructed <see cref="MessageRegistrationToken"/>.</returns>
15
+ /// <exception cref="ArgumentNullException"><paramref name="options"/> is <see langword="null"/>.</exception>
16
+ MessageRegistrationLease Build(MessageRegistrationBuildOptions options);
17
+ }
18
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: b7eed01fa2055aa49b8f89fff43a6892
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,26 @@
1
+ namespace DxMessaging.Core.MessageBus
2
+ {
3
+ using System;
4
+
5
+ /// <summary>
6
+ /// Defines how existing registrations should react when a token receives a new bus override.
7
+ /// </summary>
8
+ public enum MessageBusRebindMode
9
+ {
10
+ /// <summary>
11
+ /// Legacy default. Prefer specifying an explicit mode.
12
+ /// </summary>
13
+ [Obsolete("Specify PreserveRegistrations or RebindActive to clarify intent.")]
14
+ Unknown = 0,
15
+
16
+ /// <summary>
17
+ /// Update the override for future registrations but leave existing registrations on their current bus.
18
+ /// </summary>
19
+ PreserveRegistrations = 1,
20
+
21
+ /// <summary>
22
+ /// Rebind active registrations to the supplied bus immediately.
23
+ /// </summary>
24
+ RebindActive = 2,
25
+ }
26
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: dd6d5a7aab044fd182c11c310384ab87
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: