com.wallstop-studios.dxmessaging 2.0.0-rc27.3.1 → 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.
- package/.github/workflows/format-on-demand.yml +2 -2
- package/.github/workflows/json-format-check.yml +1 -1
- package/.github/workflows/markdown-json.yml +1 -1
- package/.github/workflows/markdownlint.yml +1 -1
- package/.github/workflows/npm-publish.yml +1 -1
- package/.github/workflows/prettier-autofix.yml +2 -2
- package/.github/workflows/yaml-format-lint.yml +1 -1
- package/Docs/Advanced.md +26 -1
- package/Docs/Comparisons.md +1352 -141
- package/Docs/Compatibility.md +27 -0
- package/Docs/DesignAndArchitecture.md +41 -34
- package/Docs/EmitShorthands.md +34 -0
- package/Docs/GettingStarted.md +84 -17
- package/Docs/Helpers.md +1 -1
- package/Docs/Index.md +28 -25
- package/Docs/Install.md +29 -6
- package/Docs/Integrations/Reflex.md +292 -0
- package/Docs/Integrations/Reflex.md.meta +7 -0
- package/Docs/Integrations/VContainer.md +324 -0
- package/Docs/Integrations/VContainer.md.meta +7 -0
- package/Docs/Integrations/Zenject.md +333 -0
- package/Docs/Integrations/Zenject.md.meta +7 -0
- package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
- package/Docs/InterceptorsAndOrdering.md +371 -17
- package/Docs/ListeningPatterns.md +206 -0
- package/Docs/MessageBusProviders.md +496 -0
- package/Docs/MessageBusProviders.md.meta +7 -0
- package/Docs/MessageTypes.md +27 -0
- package/Docs/MigrationGuide.md +45 -0
- package/Docs/Overview.md +114 -20
- package/Docs/Patterns.md +327 -2
- package/Docs/Performance.md +9 -9
- package/Docs/QuickReference.md +31 -0
- package/Docs/RuntimeConfiguration.md +407 -0
- package/Docs/RuntimeConfiguration.md.meta +7 -0
- package/Docs/UnityIntegration.md +3 -1
- package/Docs/VisualGuide.md +281 -167
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.CSharp.dll.meta +3 -3
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll +0 -0
- package/Editor/Analyzers/Microsoft.CodeAnalysis.dll.meta +2 -2
- package/Editor/Analyzers/System.Collections.Immutable.dll +0 -0
- package/Editor/Analyzers/System.Reflection.Metadata.dll +0 -0
- package/Editor/Analyzers/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
- package/README.md +388 -67
- package/Runtime/AssemblyInfo.cs +4 -0
- package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
- package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
- package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
- package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
- package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
- package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
- package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
- package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
- package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
- package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
- package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
- package/Runtime/Core/MessageHandler.cs +198 -27
- package/Runtime/Core/MessageRegistrationToken.cs +67 -25
- package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
- package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
- package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
- package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
- package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
- package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
- package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
- package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/Reflex.meta +8 -0
- package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
- package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
- package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
- package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/VContainer.meta +8 -0
- package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
- package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
- package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
- package/Runtime/Unity/Integrations/Zenject.meta +8 -0
- package/Runtime/Unity/Integrations.meta +8 -0
- package/Runtime/Unity/MessageAwareComponent.cs +102 -0
- package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
- package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
- package/Runtime/Unity/MessagingComponent.cs +164 -2
- package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
- package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
- package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
- package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
- package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
- package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
- package/Samples~/DI/Prefabs.meta +8 -0
- package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
- package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
- package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
- package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
- package/Samples~/DI/Providers.meta +8 -0
- package/Samples~/DI/README.md +51 -0
- package/Samples~/DI/README.md.meta +7 -0
- package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
- package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
- package/Samples~/DI/Reflex.meta +8 -0
- package/Samples~/DI/VContainer/SampleLifetimeScope.cs +81 -0
- package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
- package/Samples~/DI/VContainer.meta +8 -0
- package/Samples~/DI/Zenject/SampleInstaller.cs +67 -0
- package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
- package/Samples~/DI/Zenject.meta +8 -0
- package/Samples~/DI.meta +8 -0
- package/Samples~/Mini Combat/README.md +86 -28
- package/Samples~/Mini Combat/Walkthrough.md +41 -25
- package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
- package/Samples~/UI Buttons + Inspector/README.md +55 -12
- package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
- package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
- package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
- package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
- package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
- package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
- package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
- package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
- package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
- package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
- package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
- package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
- package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions.meta +8 -0
- package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
- package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
- package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
- package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
- package/Tests/Runtime/Core/NominalTests.cs +2 -2
- package/Tests/Runtime/Core/SourceGeneratorNestedTests.cs +1 -1
- package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
- package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
- package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
- package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
- package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
- package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
- package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
- package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
- package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/Reflex.meta +8 -0
- package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
- package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/VContainer.meta +8 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
- package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/Zenject.meta +8 -0
- package/Tests/Runtime/Integrations.meta +8 -0
- package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
- package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
- package/Tests/Runtime/TestUtilities.meta +9 -0
- package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
- package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
- package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
- package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
- package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
- package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
- package/Tests/Runtime/Unity.meta +9 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
namespace DxMessaging.Core.MessageBus
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
using System.Threading;
|
|
5
|
+
using DxMessaging.Core;
|
|
6
|
+
|
|
7
|
+
/// <summary>
|
|
8
|
+
/// Options controlling how <see cref="MessageRegistrationBuilder"/> constructs registration tokens.
|
|
9
|
+
/// </summary>
|
|
10
|
+
/// <remarks>
|
|
11
|
+
/// These options let you override the message bus used by the generated token, opt into diagnostics,
|
|
12
|
+
/// and register lifecycle callbacks that are triggered when the returned <see cref="MessageRegistrationLease"/> is
|
|
13
|
+
/// activated or disposed.
|
|
14
|
+
/// </remarks>
|
|
15
|
+
/// <example>
|
|
16
|
+
/// <code>
|
|
17
|
+
/// var options = new MessageRegistrationBuildOptions
|
|
18
|
+
/// {
|
|
19
|
+
/// ActivateOnBuild = true,
|
|
20
|
+
/// EnableDiagnostics = true,
|
|
21
|
+
/// Configure = token =>
|
|
22
|
+
/// {
|
|
23
|
+
/// _ = token.RegisterUntargeted<SimpleUntargetedMessage>(OnMessage);
|
|
24
|
+
/// },
|
|
25
|
+
/// Lifecycle = new MessageRegistrationLifecycle(
|
|
26
|
+
/// onBuild: token => Debug.Log("Configured"),
|
|
27
|
+
/// onActivate: token => Debug.Log("Enabled"),
|
|
28
|
+
/// onDeactivate: token => Debug.Log("Disabled"),
|
|
29
|
+
/// onDispose: token => Debug.Log("Disposed"))
|
|
30
|
+
/// };
|
|
31
|
+
///
|
|
32
|
+
/// using MessageRegistrationLease lease = registrationBuilder.Build(options);
|
|
33
|
+
/// // token is activated automatically because ActivateOnBuild = true
|
|
34
|
+
/// </code>
|
|
35
|
+
/// </example>
|
|
36
|
+
public sealed class MessageRegistrationBuildOptions
|
|
37
|
+
{
|
|
38
|
+
/// <summary>
|
|
39
|
+
/// Explicit owner identifier for the underlying <see cref="MessageHandler"/>.
|
|
40
|
+
/// When omitted, a synthetic identifier is generated automatically.
|
|
41
|
+
/// </summary>
|
|
42
|
+
public InstanceId? Owner { get; set; }
|
|
43
|
+
|
|
44
|
+
#if UNITY_2017_1_OR_NEWER
|
|
45
|
+
/// <summary>
|
|
46
|
+
/// Unity object to treat as the owner. Overrides <see cref="Owner"/> when supplied.
|
|
47
|
+
/// </summary>
|
|
48
|
+
public UnityEngine.Object UnityOwner { get; set; }
|
|
49
|
+
#endif
|
|
50
|
+
|
|
51
|
+
/// <summary>
|
|
52
|
+
/// Overrides the message bus used for registrations. Falls back to provider/global bus when null.
|
|
53
|
+
/// </summary>
|
|
54
|
+
public IMessageBus PreferredMessageBus { get; set; }
|
|
55
|
+
|
|
56
|
+
/// <summary>
|
|
57
|
+
/// Overrides the provider used to resolve a message bus when <see cref="PreferredMessageBus"/> is null.
|
|
58
|
+
/// </summary>
|
|
59
|
+
public IMessageBusProvider MessageBusProvider { get; set; }
|
|
60
|
+
|
|
61
|
+
/// <summary>
|
|
62
|
+
/// Indicates whether the underlying <see cref="MessageHandler"/> starts in an active state.
|
|
63
|
+
/// </summary>
|
|
64
|
+
public bool HandlerStartsActive { get; set; } = true;
|
|
65
|
+
|
|
66
|
+
/// <summary>
|
|
67
|
+
/// Indicates whether <see cref="MessageRegistrationToken.Enable"/> should be invoked immediately.
|
|
68
|
+
/// </summary>
|
|
69
|
+
public bool ActivateOnBuild { get; set; }
|
|
70
|
+
|
|
71
|
+
/// <summary>
|
|
72
|
+
/// Enables <see cref="MessageRegistrationToken.DiagnosticMode"/> on the created token.
|
|
73
|
+
/// </summary>
|
|
74
|
+
public bool EnableDiagnostics { get; set; }
|
|
75
|
+
|
|
76
|
+
/// <summary>
|
|
77
|
+
/// Optional hook invoked after the token has been constructed but before lifecycle callbacks.
|
|
78
|
+
/// Use this to stage registrations.
|
|
79
|
+
/// </summary>
|
|
80
|
+
public Action<MessageRegistrationToken> Configure { get; set; }
|
|
81
|
+
|
|
82
|
+
/// <summary>
|
|
83
|
+
/// Lifecycle hooks that fire during build, activation, deactivation, and disposal.
|
|
84
|
+
/// </summary>
|
|
85
|
+
public MessageRegistrationLifecycle Lifecycle { get; set; }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// <summary>
|
|
89
|
+
/// Lifecycle callbacks for registration leases.
|
|
90
|
+
/// </summary>
|
|
91
|
+
/// <remarks>
|
|
92
|
+
/// Callbacks run in the following order:
|
|
93
|
+
/// <list type="number">
|
|
94
|
+
/// <item><description><c>OnBuild</c> (invoked immediately after the lease is created, before activation).</description></item>
|
|
95
|
+
/// <item><description><c>OnActivate</c> (invoked when <see cref="MessageRegistrationLease.Activate"/> runs or when <see cref="MessageRegistrationBuildOptions.ActivateOnBuild"/> is set).</description></item>
|
|
96
|
+
/// <item><description><c>OnDeactivate</c> (invoked when <see cref="MessageRegistrationLease.Deactivate"/> runs or the lease is disposed while active).</description></item>
|
|
97
|
+
/// <item><description><c>OnDispose</c> (invoked during <see cref="MessageRegistrationLease.Dispose"/>).</description></item>
|
|
98
|
+
/// </list>
|
|
99
|
+
/// </remarks>
|
|
100
|
+
public readonly struct MessageRegistrationLifecycle
|
|
101
|
+
{
|
|
102
|
+
public MessageRegistrationLifecycle(
|
|
103
|
+
Action<MessageRegistrationToken> onBuild,
|
|
104
|
+
Action<MessageRegistrationToken> onActivate,
|
|
105
|
+
Action<MessageRegistrationToken> onDeactivate,
|
|
106
|
+
Action<MessageRegistrationToken> onDispose
|
|
107
|
+
)
|
|
108
|
+
{
|
|
109
|
+
OnBuild = onBuild;
|
|
110
|
+
OnActivate = onActivate;
|
|
111
|
+
OnDeactivate = onDeactivate;
|
|
112
|
+
OnDispose = onDispose;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public Action<MessageRegistrationToken> OnBuild { get; }
|
|
116
|
+
|
|
117
|
+
public Action<MessageRegistrationToken> OnActivate { get; }
|
|
118
|
+
|
|
119
|
+
public Action<MessageRegistrationToken> OnDeactivate { get; }
|
|
120
|
+
|
|
121
|
+
public Action<MessageRegistrationToken> OnDispose { get; }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/// <summary>
|
|
125
|
+
/// Represents the lifetime of a registration token constructed by the builder.
|
|
126
|
+
/// </summary>
|
|
127
|
+
/// <remarks>
|
|
128
|
+
/// A lease grants direct access to the created <see cref="MessageRegistrationToken"/>, holds a reference to the
|
|
129
|
+
/// underlying <see cref="MessageHandler"/>, and coordinates lifecycle callbacks supplied via
|
|
130
|
+
/// <see cref="MessageRegistrationBuildOptions.Lifecycle"/>.
|
|
131
|
+
/// </remarks>
|
|
132
|
+
public sealed class MessageRegistrationLease : IDisposable
|
|
133
|
+
{
|
|
134
|
+
private readonly MessageRegistrationToken _token;
|
|
135
|
+
private readonly MessageHandler _messageHandler;
|
|
136
|
+
private readonly IMessageBus _messageBus;
|
|
137
|
+
private readonly MessageRegistrationLifecycle _lifecycle;
|
|
138
|
+
private bool _isActive;
|
|
139
|
+
private bool _disposed;
|
|
140
|
+
|
|
141
|
+
internal MessageRegistrationLease(
|
|
142
|
+
MessageRegistrationToken token,
|
|
143
|
+
MessageHandler messageHandler,
|
|
144
|
+
IMessageBus messageBus,
|
|
145
|
+
MessageRegistrationLifecycle lifecycle
|
|
146
|
+
)
|
|
147
|
+
{
|
|
148
|
+
_token = token ?? throw new ArgumentNullException(nameof(token));
|
|
149
|
+
_messageHandler =
|
|
150
|
+
messageHandler ?? throw new ArgumentNullException(nameof(messageHandler));
|
|
151
|
+
_messageBus = messageBus;
|
|
152
|
+
_lifecycle = lifecycle;
|
|
153
|
+
_isActive = false;
|
|
154
|
+
_disposed = false;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// <summary>
|
|
158
|
+
/// Gets the registration token created for this lease.
|
|
159
|
+
/// </summary>
|
|
160
|
+
public MessageRegistrationToken Token => _token;
|
|
161
|
+
|
|
162
|
+
/// <summary>
|
|
163
|
+
/// Gets the handler hosting the lease's registrations.
|
|
164
|
+
/// </summary>
|
|
165
|
+
public MessageHandler Handler => _messageHandler;
|
|
166
|
+
|
|
167
|
+
/// <summary>
|
|
168
|
+
/// Gets the message bus that registrations created through this lease will target by default.
|
|
169
|
+
/// </summary>
|
|
170
|
+
public IMessageBus MessageBus => _messageBus;
|
|
171
|
+
|
|
172
|
+
/// <summary>
|
|
173
|
+
/// Gets the owner identifier associated with the underlying handler.
|
|
174
|
+
/// </summary>
|
|
175
|
+
public InstanceId Owner => _messageHandler.owner;
|
|
176
|
+
|
|
177
|
+
/// <summary>
|
|
178
|
+
/// Gets a value indicating whether the lease is currently active (token enabled).
|
|
179
|
+
/// </summary>
|
|
180
|
+
public bool IsActive => _isActive;
|
|
181
|
+
|
|
182
|
+
/// <summary>
|
|
183
|
+
/// Enables the token managed by this lease and raises the activation lifecycle callback if provided.
|
|
184
|
+
/// </summary>
|
|
185
|
+
/// <exception cref="ObjectDisposedException">Thrown if the lease has already been disposed.</exception>
|
|
186
|
+
public void Activate()
|
|
187
|
+
{
|
|
188
|
+
EnsureNotDisposed();
|
|
189
|
+
if (_isActive)
|
|
190
|
+
{
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
_messageHandler.active = true;
|
|
195
|
+
_token.Enable();
|
|
196
|
+
if (_lifecycle.OnActivate != null)
|
|
197
|
+
{
|
|
198
|
+
_lifecycle.OnActivate(_token);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
_isActive = true;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public void Deactivate()
|
|
205
|
+
{
|
|
206
|
+
if (_disposed || !_isActive)
|
|
207
|
+
{
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (_lifecycle.OnDeactivate != null)
|
|
212
|
+
{
|
|
213
|
+
_lifecycle.OnDeactivate(_token);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
_token.Disable();
|
|
217
|
+
_messageHandler.active = false;
|
|
218
|
+
_isActive = false;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public void Dispose()
|
|
222
|
+
{
|
|
223
|
+
if (_disposed)
|
|
224
|
+
{
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
Deactivate();
|
|
229
|
+
if (_lifecycle.OnDispose != null)
|
|
230
|
+
{
|
|
231
|
+
_lifecycle.OnDispose(_token);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
_disposed = true;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
internal void InvokeBuildHook()
|
|
238
|
+
{
|
|
239
|
+
if (_lifecycle.OnBuild != null)
|
|
240
|
+
{
|
|
241
|
+
_lifecycle.OnBuild(_token);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private void EnsureNotDisposed()
|
|
246
|
+
{
|
|
247
|
+
if (_disposed)
|
|
248
|
+
{
|
|
249
|
+
throw new ObjectDisposedException(nameof(MessageRegistrationLease));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/// <summary>
|
|
255
|
+
/// Default implementation that composes message handlers, registration tokens, and lifecycle hooks.
|
|
256
|
+
/// </summary>
|
|
257
|
+
public sealed class MessageRegistrationBuilder : IMessageRegistrationBuilder
|
|
258
|
+
{
|
|
259
|
+
private readonly IMessageBusProvider _messageBusProvider;
|
|
260
|
+
private static int _syntheticOwnerCounter;
|
|
261
|
+
|
|
262
|
+
public MessageRegistrationBuilder()
|
|
263
|
+
{
|
|
264
|
+
_messageBusProvider = null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
public MessageRegistrationBuilder(IMessageBusProvider messageBusProvider)
|
|
268
|
+
{
|
|
269
|
+
_messageBusProvider = messageBusProvider;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/// <summary>
|
|
273
|
+
/// Creates a <see cref="MessageRegistrationLease"/> configured according to the supplied <paramref name="options"/>.
|
|
274
|
+
/// </summary>
|
|
275
|
+
/// <param name="options">Options controlling bus selection, diagnostics, and lifecycle behavior.</param>
|
|
276
|
+
/// <returns>A lease that wraps the created <see cref="MessageRegistrationToken"/>.</returns>
|
|
277
|
+
/// <exception cref="ArgumentNullException">Thrown when <paramref name="options"/> is <see langword="null"/>.</exception>
|
|
278
|
+
public MessageRegistrationLease Build(MessageRegistrationBuildOptions options)
|
|
279
|
+
{
|
|
280
|
+
if (options == null)
|
|
281
|
+
{
|
|
282
|
+
throw new ArgumentNullException(nameof(options));
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
IMessageBus messageBus = ResolveMessageBus(options);
|
|
286
|
+
InstanceId owner = ResolveOwner(options);
|
|
287
|
+
MessageHandler messageHandler = new MessageHandler(owner, messageBus);
|
|
288
|
+
messageHandler.active = options.HandlerStartsActive;
|
|
289
|
+
MessageRegistrationToken token = MessageRegistrationToken.Create(
|
|
290
|
+
messageHandler,
|
|
291
|
+
messageBus
|
|
292
|
+
);
|
|
293
|
+
token.DiagnosticMode = options.EnableDiagnostics;
|
|
294
|
+
if (options.Configure != null)
|
|
295
|
+
{
|
|
296
|
+
options.Configure(token);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
MessageRegistrationLease lease = new MessageRegistrationLease(
|
|
300
|
+
token,
|
|
301
|
+
messageHandler,
|
|
302
|
+
messageBus,
|
|
303
|
+
options.Lifecycle
|
|
304
|
+
);
|
|
305
|
+
lease.InvokeBuildHook();
|
|
306
|
+
|
|
307
|
+
if (options.ActivateOnBuild)
|
|
308
|
+
{
|
|
309
|
+
lease.Activate();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return lease;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
private static InstanceId ResolveOwner(MessageRegistrationBuildOptions options)
|
|
316
|
+
{
|
|
317
|
+
#if UNITY_2017_1_OR_NEWER
|
|
318
|
+
if (options.UnityOwner != null)
|
|
319
|
+
{
|
|
320
|
+
if (options.UnityOwner is UnityEngine.GameObject gameObject)
|
|
321
|
+
{
|
|
322
|
+
return gameObject;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (options.UnityOwner is UnityEngine.Component component)
|
|
326
|
+
{
|
|
327
|
+
return component;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return new InstanceId(options.UnityOwner.GetInstanceID());
|
|
331
|
+
}
|
|
332
|
+
#endif
|
|
333
|
+
if (options.Owner.HasValue)
|
|
334
|
+
{
|
|
335
|
+
return options.Owner.Value;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
int generatedId = Interlocked.Decrement(ref _syntheticOwnerCounter);
|
|
339
|
+
|
|
340
|
+
InstanceId syntheticOwner = new InstanceId(generatedId);
|
|
341
|
+
return syntheticOwner;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
private IMessageBus ResolveMessageBus(MessageRegistrationBuildOptions options)
|
|
345
|
+
{
|
|
346
|
+
if (options.PreferredMessageBus != null)
|
|
347
|
+
{
|
|
348
|
+
return options.PreferredMessageBus;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
IMessageBusProvider effectiveProvider =
|
|
352
|
+
options.MessageBusProvider ?? _messageBusProvider;
|
|
353
|
+
if (effectiveProvider != null)
|
|
354
|
+
{
|
|
355
|
+
IMessageBus resolved = effectiveProvider.Resolve();
|
|
356
|
+
if (resolved != null)
|
|
357
|
+
{
|
|
358
|
+
return resolved;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/// <summary>
|
|
367
|
+
/// Simple provider that always resolves to the supplied bus instance.
|
|
368
|
+
/// </summary>
|
|
369
|
+
public sealed class FixedMessageBusProvider : IMessageBusProvider
|
|
370
|
+
{
|
|
371
|
+
private readonly IMessageBus _messageBus;
|
|
372
|
+
|
|
373
|
+
public FixedMessageBusProvider(IMessageBus messageBus)
|
|
374
|
+
{
|
|
375
|
+
_messageBus = messageBus ?? throw new ArgumentNullException(nameof(messageBus));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
public IMessageBus Resolve()
|
|
379
|
+
{
|
|
380
|
+
return _messageBus;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|