Skip to content

Commit 9e6d4ef

Browse files
committed
add UseTransactionCallback and mark UseSessionCallback obsolete
1 parent 3f75444 commit 9e6d4ef

File tree

4 files changed

+157
-11
lines changed

4 files changed

+157
-11
lines changed

src/Smdn.Net.MuninNode/Smdn.Net.MuninNode.DependencyInjection/IMuninNodeBuilderExtensions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@ Func<IServiceProvider, INodeSessionCallback> buildSessionCallback
123123
buildSessionCallback: buildSessionCallback ?? throw new ArgumentNullException(nameof(buildSessionCallback))
124124
);
125125

126+
#pragma warning disable CS0419
127+
/// <remarks>
128+
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
129+
/// </remarks>
130+
public static IMuninNodeBuilder UseTransactionCallback(
131+
this IMuninNodeBuilder builder,
132+
Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc,
133+
Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc
134+
)
135+
#pragma warning restore CS0419
136+
=> MuninNodeBuilderExtensions.UseTransactionCallback(
137+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
138+
onStartTransactionAsyncFunc: onStartTransactionAsyncFunc,
139+
onEndTransactionAsyncFunc: onEndTransactionAsyncFunc
140+
);
141+
126142
public static IMuninNodeBuilder UseListenerFactory(
127143
this IMuninNodeBuilder builder,
128144
IMuninNodeListenerFactory listenerFactory

src/Smdn.Net.MuninNode/Smdn.Net.MuninNode.DependencyInjection/MuninNodeBuilder.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
using System;
55
using System.Collections.Generic;
66
using System.Linq;
7+
using System.Threading;
8+
using System.Threading.Tasks;
79

810
using Microsoft.Extensions.DependencyInjection;
911
using Microsoft.Extensions.Logging;
@@ -24,6 +26,8 @@ public class MuninNodeBuilder : IMuninNodeBuilder {
2426
private readonly List<Func<IServiceProvider, IPlugin>> pluginFactories = new(capacity: 4);
2527
private Func<IServiceProvider, IPluginProvider>? buildPluginProvider;
2628
[Obsolete] private Func<IServiceProvider, INodeSessionCallback>? buildSessionCallback;
29+
private Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc;
30+
private Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc;
2731
private Func<IServiceProvider, IMuninNodeListenerFactory>? buildListenerFactory;
2832

2933
/// <summary>
@@ -75,6 +79,15 @@ Func<IServiceProvider, INodeSessionCallback> buildSessionCallback
7579
this.buildSessionCallback = buildSessionCallback;
7680
}
7781

82+
internal void SetTransactionCallback(
83+
Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc,
84+
Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc
85+
)
86+
{
87+
this.onStartTransactionAsyncFunc = onStartTransactionAsyncFunc;
88+
this.onEndTransactionAsyncFunc = onEndTransactionAsyncFunc;
89+
}
90+
7891
internal void SetListenerFactory(
7992
Func<IServiceProvider, IMuninNodeListenerFactory> buildListenerFactory
8093
)
@@ -102,34 +115,50 @@ public IMuninNode Build(IServiceProvider serviceProvider)
102115
? new PluginProvider(
103116
plugins: pluginFactories.Select(factory => factory(serviceProvider)).ToList(),
104117
#pragma warning disable CS0612
105-
sessionCallback: buildSessionCallback?.Invoke(serviceProvider)
118+
sessionCallback: buildSessionCallback?.Invoke(serviceProvider),
106119
#pragma warning restore CS0612
120+
onStartTransactionAsyncFunc: onStartTransactionAsyncFunc,
121+
onEndTransactionAsyncFunc: onEndTransactionAsyncFunc
107122
)
108123
: buildPluginProvider.Invoke(serviceProvider),
109124
listenerFactory: buildListenerFactory?.Invoke(serviceProvider),
110125
serviceProvider: serviceProvider
111126
);
112127
}
113128

114-
private sealed class PluginProvider : IPluginProvider {
129+
private sealed class PluginProvider : IPluginProvider, ITransactionCallback {
115130
public IReadOnlyCollection<IPlugin> Plugins { get; }
116131

117132
[Obsolete]
118133
public INodeSessionCallback? SessionCallback { get; }
119134

135+
private readonly Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc;
136+
private readonly Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc;
137+
120138
public PluginProvider(
121139
IReadOnlyCollection<IPlugin> plugins,
122140
#pragma warning disable CS0618
123-
INodeSessionCallback? sessionCallback
141+
INodeSessionCallback? sessionCallback,
124142
#pragma warning restore CS0618
143+
Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc,
144+
Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc
125145
)
126146
{
127147
Plugins = plugins ?? throw new ArgumentNullException(nameof(plugins));
128148

129149
#pragma warning disable CS0612
130150
SessionCallback = sessionCallback;
131151
#pragma warning restore CS0612
152+
153+
this.onStartTransactionAsyncFunc = onStartTransactionAsyncFunc;
154+
this.onEndTransactionAsyncFunc = onEndTransactionAsyncFunc;
132155
}
156+
157+
public ValueTask StartTransactionAsync(CancellationToken cancellationToken)
158+
=> onStartTransactionAsyncFunc?.Invoke(cancellationToken) ?? default;
159+
160+
public ValueTask EndTransactionAsync(CancellationToken cancellationToken)
161+
=> onEndTransactionAsyncFunc?.Invoke(cancellationToken) ?? default;
133162
}
134163

135164
protected virtual IMuninNode Build(

src/Smdn.Net.MuninNode/Smdn.Net.MuninNode.DependencyInjection/MuninNodeBuilderExtensions.cs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,20 @@ Func<IServiceProvider, IPluginProvider> buildPluginProvider
100100
return builder;
101101
}
102102

103+
#pragma warning disable CS0618
104+
private const string ObsoleteMessageForUseSessionCallback =
105+
$"{nameof(INodeSessionCallback)} is deprecated and will be removed in the next major version release. " +
106+
$"Use ${nameof(UseTransactionCallback)} instead of {nameof(UseSessionCallback)}.";
107+
#pragma warning restore CS0618
108+
103109
#pragma warning disable CS0419
104110
/// <remarks>
105111
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
106112
/// </remarks>
113+
[Obsolete(ObsoleteMessageForUseSessionCallback)]
107114
public static TMuninNodeBuilder UseSessionCallback<TMuninNodeBuilder>(
108115
this TMuninNodeBuilder builder,
109-
#pragma warning disable CS0618
110116
INodeSessionCallback sessionCallback
111-
#pragma warning restore CS0618
112117
)
113118
where TMuninNodeBuilder : MuninNodeBuilder
114119
#pragma warning restore CS0419
@@ -128,6 +133,7 @@ INodeSessionCallback sessionCallback
128133
/// <remarks>
129134
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
130135
/// </remarks>
136+
[Obsolete(ObsoleteMessageForUseSessionCallback)]
131137
public static TMuninNodeBuilder UseSessionCallback<TMuninNodeBuilder>(
132138
this TMuninNodeBuilder builder,
133139
Func<string, CancellationToken, ValueTask>? reportSessionStartedAsyncFunc,
@@ -137,12 +143,10 @@ public static TMuninNodeBuilder UseSessionCallback<TMuninNodeBuilder>(
137143
#pragma warning restore CS0419
138144
=> UseSessionCallback(
139145
builder: builder,
140-
#pragma warning disable CS0612
141146
buildSessionCallback: _ => new SessionCallbackFuncWrapper(
142147
reportSessionStartedAsyncFunc,
143148
reportSessionClosedAsyncFunc
144149
)
145-
#pragma warning restore CS0612
146150
);
147151

148152
[Obsolete]
@@ -165,11 +169,10 @@ public ValueTask ReportSessionClosedAsync(string sessionId, CancellationToken ca
165169
/// <remarks>
166170
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
167171
/// </remarks>
172+
[Obsolete(ObsoleteMessageForUseSessionCallback)]
168173
public static TMuninNodeBuilder UseSessionCallback<TMuninNodeBuilder>(
169174
this TMuninNodeBuilder builder,
170-
#pragma warning disable CS0618
171175
Func<IServiceProvider, INodeSessionCallback> buildSessionCallback
172-
#pragma warning restore CS0618
173176
)
174177
where TMuninNodeBuilder : MuninNodeBuilder
175178
#pragma warning restore CS0419
@@ -179,9 +182,30 @@ Func<IServiceProvider, INodeSessionCallback> buildSessionCallback
179182
if (buildSessionCallback is null)
180183
throw new ArgumentNullException(nameof(buildSessionCallback));
181184

182-
#pragma warning disable CS0612
183185
builder.SetSessionCallbackFactory(buildSessionCallback);
184-
#pragma warning restore CS0612
186+
187+
return builder;
188+
}
189+
190+
#pragma warning disable CS0419
191+
/// <remarks>
192+
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
193+
/// </remarks>
194+
public static TMuninNodeBuilder UseTransactionCallback<TMuninNodeBuilder>(
195+
this TMuninNodeBuilder builder,
196+
Func<CancellationToken, ValueTask>? onStartTransactionAsyncFunc,
197+
Func<CancellationToken, ValueTask>? onEndTransactionAsyncFunc
198+
)
199+
where TMuninNodeBuilder : MuninNodeBuilder
200+
#pragma warning restore CS0419
201+
{
202+
if (builder is null)
203+
throw new ArgumentNullException(nameof(builder));
204+
205+
builder.SetTransactionCallback(
206+
onStartTransactionAsyncFunc,
207+
onEndTransactionAsyncFunc
208+
);
185209

186210
return builder;
187211
}

tests/Smdn.Net.MuninNode/Smdn.Net.MuninNode.DependencyInjection/IMuninNodeBuilderExtensions.cs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,83 @@ public void UseSessionCallback_FuncBuildSessionCallback()
454454
}
455455
#pragma warning restore CS0618
456456

457+
[Test]
458+
[CancelAfter(1000)]
459+
public void UseTransactionCallback(
460+
[Values] bool setOnStartTransactionAsyncFunc,
461+
[Values] bool setOnEndTransactionAsyncFunc,
462+
CancellationToken cancellationToken
463+
)
464+
{
465+
var numberOfInvocationOfStartTransactionAsync = 0;
466+
var numberOfInvocationOfEndTransactionAsync = 0;
467+
468+
var services = new ServiceCollection();
469+
470+
services.AddMunin(
471+
builder =>
472+
builder
473+
.AddNode(option => { })
474+
.UseTransactionCallback(
475+
onStartTransactionAsyncFunc: setOnStartTransactionAsyncFunc
476+
? StartTransactionAsync
477+
: null,
478+
onEndTransactionAsyncFunc: setOnEndTransactionAsyncFunc
479+
? EndTransactionAsync
480+
: null
481+
)
482+
);
483+
484+
ValueTask StartTransactionAsync(CancellationToken ct)
485+
{
486+
numberOfInvocationOfStartTransactionAsync++;
487+
488+
Assert.That(ct, Is.EqualTo(cancellationToken));
489+
490+
return default;
491+
}
492+
493+
ValueTask EndTransactionAsync(CancellationToken ct)
494+
{
495+
numberOfInvocationOfEndTransactionAsync++;
496+
497+
Assert.That(ct, Is.EqualTo(cancellationToken));
498+
499+
return default;
500+
}
501+
502+
var serviceProvider = services.BuildServiceProvider();
503+
var node = (NodeBase)serviceProvider.GetRequiredService<IMuninNode>();
504+
505+
Assert.That(node.PluginProvider, Is.InstanceOf<ITransactionCallback>());
506+
507+
var transactionCallback = (ITransactionCallback)node.PluginProvider;
508+
509+
Assert.That(
510+
async () => await transactionCallback.StartTransactionAsync(cancellationToken),
511+
Throws.Nothing
512+
);
513+
514+
Assert.That(
515+
numberOfInvocationOfStartTransactionAsync,
516+
setOnStartTransactionAsyncFunc
517+
? Is.EqualTo(1)
518+
: Is.Zero
519+
);
520+
521+
Assert.That(
522+
async () => await transactionCallback.EndTransactionAsync(cancellationToken),
523+
Throws.Nothing
524+
);
525+
526+
Assert.That(
527+
numberOfInvocationOfEndTransactionAsync,
528+
setOnEndTransactionAsyncFunc
529+
? Is.EqualTo(1)
530+
: Is.Zero
531+
);
532+
}
533+
457534
[Test]
458535
public void UseListenerFactory_IMuninNodeListenerFactory_ArgumentNull()
459536
{

0 commit comments

Comments
 (0)