Skip to content

Commit b4fd885

Browse files
committed
mark IMuninNodeBuilder obsolete
1 parent a7a8c39 commit b4fd885

File tree

7 files changed

+338
-157
lines changed

7 files changed

+338
-157
lines changed

src/Smdn.Net.MuninNode.Hosting/Smdn.Net.MuninNode.Hosting/IServiceCollectionExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ public static class IServiceCollectionExtensions {
2929
/// <paramref name="configureNode"/> is <see langword="null"/>, or
3030
/// <paramref name="buildNode"/> is <see langword="null"/>.
3131
/// </exception>
32+
#pragma warning disable CS0618 // accept MuninNodeBuilder instead of IMuninNodeBuilder
3233
public static IServiceCollection AddHostedMuninNodeService(
3334
this IServiceCollection services,
3435
Action<MuninNodeOptions> configureNode,
3536
Action<IMuninNodeBuilder> buildNode
3637
)
38+
#pragma warning restore CS0618
3739
{
3840
if (services is null)
3941
throw new ArgumentNullException(nameof(services));

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ namespace Smdn.Net.MuninNode.DependencyInjection;
1414
/// <see cref="IMuninNodeBuilderExtensions.AddPlugin"/>
1515
/// <see cref="IMuninNodeBuilderExtensions.UseListenerFactory"/>
1616
/// <see cref="IMuninNodeBuilderExtensions.UseSessionCallback"/>
17+
[Obsolete($"Use or inherit {nameof(MuninNodeBuilder)} instead.")]
1718
public interface IMuninNodeBuilder {
1819
/// <summary>
1920
/// Gets the <see cref="IServiceCollection"/> where the <c>Munin-Node</c> services are configured.

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

Lines changed: 44 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@
1111

1212
namespace Smdn.Net.MuninNode.DependencyInjection;
1313

14+
[Obsolete($"Use {nameof(MuninNodeBuilderExtensions)} instead.")]
1415
public static class IMuninNodeBuilderExtensions {
16+
private static MuninNodeBuilder ThrowIfBuilderTypeIsNotSupported(IMuninNodeBuilder builder)
17+
{
18+
if (builder is not MuninNodeBuilder muninNodeBuilder)
19+
throw new NotSupportedException($"The builder implementation of type `{builder.GetType().FullName}` does not support service key configuration.");
20+
21+
return muninNodeBuilder;
22+
}
23+
1524
#pragma warning disable CS0419
1625
/// <remarks>
1726
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
@@ -21,17 +30,10 @@ public static IMuninNodeBuilder AddPlugin(
2130
IPlugin plugin
2231
)
2332
#pragma warning restore CS0419
24-
{
25-
if (builder is null)
26-
throw new ArgumentNullException(nameof(builder));
27-
if (plugin is null)
28-
throw new ArgumentNullException(nameof(plugin));
29-
30-
return AddPlugin(
31-
builder: builder,
32-
buildPlugin: _ => plugin
33+
=> MuninNodeBuilderExtensions.AddPlugin(
34+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
35+
plugin: plugin ?? throw new ArgumentNullException(nameof(plugin))
3336
);
34-
}
3537

3638
#pragma warning disable CS0419
3739
/// <remarks>
@@ -42,19 +44,10 @@ public static IMuninNodeBuilder AddPlugin(
4244
Func<IServiceProvider, IPlugin> buildPlugin
4345
)
4446
#pragma warning restore CS0419
45-
{
46-
if (builder is null)
47-
throw new ArgumentNullException(nameof(builder));
48-
if (buildPlugin is null)
49-
throw new ArgumentNullException(nameof(buildPlugin));
50-
51-
if (builder is not MuninNodeBuilder muninNodeBuilder)
52-
throw new NotSupportedException($"The builder implementation of type `{builder.GetType().FullName}` does not support service key configuration.");
53-
54-
muninNodeBuilder.AddPluginFactory(buildPlugin);
55-
56-
return builder;
57-
}
47+
=> MuninNodeBuilderExtensions.AddPlugin(
48+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
49+
buildPlugin: buildPlugin ?? throw new ArgumentNullException(nameof(buildPlugin))
50+
);
5851

5952
#pragma warning disable CS0419
6053
/// <remarks>
@@ -66,17 +59,10 @@ public static IMuninNodeBuilder UsePluginProvider(
6659
IPluginProvider pluginProvider
6760
)
6861
#pragma warning restore CS0419
69-
{
70-
if (builder is null)
71-
throw new ArgumentNullException(nameof(builder));
72-
if (pluginProvider is null)
73-
throw new ArgumentNullException(nameof(pluginProvider));
74-
75-
return UsePluginProvider(
76-
builder: builder,
77-
buildPluginProvider: _ => pluginProvider
62+
=> MuninNodeBuilderExtensions.UsePluginProvider(
63+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
64+
pluginProvider: pluginProvider ?? throw new ArgumentNullException(nameof(pluginProvider))
7865
);
79-
}
8066

8167
#pragma warning disable CS0419
8268
/// <remarks>
@@ -88,19 +74,10 @@ public static IMuninNodeBuilder UsePluginProvider(
8874
Func<IServiceProvider, IPluginProvider> buildPluginProvider
8975
)
9076
#pragma warning restore CS0419
91-
{
92-
if (builder is null)
93-
throw new ArgumentNullException(nameof(builder));
94-
if (buildPluginProvider is null)
95-
throw new ArgumentNullException(nameof(buildPluginProvider));
96-
97-
if (builder is not MuninNodeBuilder muninNodeBuilder)
98-
throw new NotSupportedException($"The builder implementation of type `{builder.GetType().FullName}` does not support service key configuration.");
99-
100-
muninNodeBuilder.SetPluginProviderFactory(buildPluginProvider);
101-
102-
return builder;
103-
}
77+
=> MuninNodeBuilderExtensions.UsePluginProvider(
78+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
79+
buildPluginProvider: buildPluginProvider ?? throw new ArgumentNullException(nameof(buildPluginProvider))
80+
);
10481

10582
#pragma warning disable CS0419
10683
/// <remarks>
@@ -111,17 +88,10 @@ public static IMuninNodeBuilder UseSessionCallback(
11188
INodeSessionCallback sessionCallback
11289
)
11390
#pragma warning restore CS0419
114-
{
115-
if (builder is null)
116-
throw new ArgumentNullException(nameof(builder));
117-
if (sessionCallback is null)
118-
throw new ArgumentNullException(nameof(sessionCallback));
119-
120-
return UseSessionCallback(
121-
builder: builder,
122-
buildSessionCallback: _ => sessionCallback
91+
=> MuninNodeBuilderExtensions.UseSessionCallback(
92+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
93+
sessionCallback: sessionCallback ?? throw new ArgumentNullException(nameof(sessionCallback))
12394
);
124-
}
12595

12696
#pragma warning disable CS0419
12797
/// <remarks>
@@ -133,29 +103,12 @@ public static IMuninNodeBuilder UseSessionCallback(
133103
Func<string, CancellationToken, ValueTask>? reportSessionClosedAsyncFunc
134104
)
135105
#pragma warning restore CS0419
136-
=> UseSessionCallback(
137-
builder: builder,
138-
buildSessionCallback: _ => new SessionCallbackFuncWrapper(
139-
reportSessionStartedAsyncFunc,
140-
reportSessionClosedAsyncFunc
141-
)
106+
=> MuninNodeBuilderExtensions.UseSessionCallback(
107+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
108+
reportSessionStartedAsyncFunc: reportSessionStartedAsyncFunc,
109+
reportSessionClosedAsyncFunc: reportSessionClosedAsyncFunc
142110
);
143111

144-
private sealed class SessionCallbackFuncWrapper(
145-
Func<string, CancellationToken, ValueTask>? reportSessionStartedAsyncFunc,
146-
Func<string, CancellationToken, ValueTask>? reportSessionClosedAsyncFunc
147-
) : INodeSessionCallback {
148-
public ValueTask ReportSessionStartedAsync(string sessionId, CancellationToken cancellationToken)
149-
=> reportSessionStartedAsyncFunc is null
150-
? default
151-
: reportSessionStartedAsyncFunc(sessionId, cancellationToken);
152-
153-
public ValueTask ReportSessionClosedAsync(string sessionId, CancellationToken cancellationToken)
154-
=> reportSessionClosedAsyncFunc is null
155-
? default
156-
: reportSessionClosedAsyncFunc(sessionId, cancellationToken);
157-
}
158-
159112
#pragma warning disable CS0419
160113
/// <remarks>
161114
/// If <see cref="UsePluginProvider"/> is called, the configurations made by this method will be overridden.
@@ -165,96 +118,35 @@ public static IMuninNodeBuilder UseSessionCallback(
165118
Func<IServiceProvider, INodeSessionCallback> buildSessionCallback
166119
)
167120
#pragma warning restore CS0419
168-
{
169-
if (builder is null)
170-
throw new ArgumentNullException(nameof(builder));
171-
if (buildSessionCallback is null)
172-
throw new ArgumentNullException(nameof(buildSessionCallback));
173-
174-
if (builder is not MuninNodeBuilder muninNodeBuilder)
175-
throw new NotSupportedException($"The builder implementation of type `{builder.GetType().FullName}` does not support service key configuration.");
176-
177-
muninNodeBuilder.SetSessionCallbackFactory(buildSessionCallback);
178-
179-
return builder;
180-
}
121+
=> MuninNodeBuilderExtensions.UseSessionCallback(
122+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
123+
buildSessionCallback: buildSessionCallback ?? throw new ArgumentNullException(nameof(buildSessionCallback))
124+
);
181125

182126
public static IMuninNodeBuilder UseListenerFactory(
183127
this IMuninNodeBuilder builder,
184128
IMuninNodeListenerFactory listenerFactory
185129
)
186-
{
187-
if (builder is null)
188-
throw new ArgumentNullException(nameof(builder));
189-
if (listenerFactory is null)
190-
throw new ArgumentNullException(nameof(listenerFactory));
191-
192-
return UseListenerFactory(
193-
builder: builder,
194-
buildListenerFactory: _ => listenerFactory
130+
=> MuninNodeBuilderExtensions.UseListenerFactory(
131+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
132+
listenerFactory: listenerFactory ?? throw new ArgumentNullException(nameof(listenerFactory))
195133
);
196-
}
197134

198135
public static IMuninNodeBuilder UseListenerFactory(
199136
this IMuninNodeBuilder builder,
200137
Func<IServiceProvider, EndPoint, IMuninNode, CancellationToken, ValueTask<IMuninNodeListener>> createListenerAsyncFunc
201138
)
202-
{
203-
if (builder is null)
204-
throw new ArgumentNullException(nameof(builder));
205-
if (createListenerAsyncFunc is null)
206-
throw new ArgumentNullException(nameof(createListenerAsyncFunc));
207-
208-
return UseListenerFactory(
209-
builder: builder,
210-
buildListenerFactory: serviceProvider => new CreateListenerAsyncFuncWrapper(
211-
serviceProvider,
212-
createListenerAsyncFunc
213-
)
139+
=> MuninNodeBuilderExtensions.UseListenerFactory(
140+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
141+
createListenerAsyncFunc: createListenerAsyncFunc ?? throw new ArgumentNullException(nameof(createListenerAsyncFunc))
214142
);
215-
}
216-
217-
private sealed class CreateListenerAsyncFuncWrapper(
218-
IServiceProvider serviceProvider,
219-
Func<IServiceProvider, EndPoint, IMuninNode, CancellationToken, ValueTask<IMuninNodeListener>> createListenerAsyncFunc
220-
) : IMuninNodeListenerFactory {
221-
public ValueTask<IMuninNodeListener> CreateAsync(EndPoint endPoint, IMuninNode node, CancellationToken cancellationToken)
222-
=> createListenerAsyncFunc(serviceProvider, endPoint, node, cancellationToken);
223-
}
224143

225144
public static IMuninNodeBuilder UseListenerFactory(
226145
this IMuninNodeBuilder builder,
227146
Func<IServiceProvider, IMuninNodeListenerFactory> buildListenerFactory
228147
)
229-
{
230-
if (builder is null)
231-
throw new ArgumentNullException(nameof(builder));
232-
if (buildListenerFactory is null)
233-
throw new ArgumentNullException(nameof(buildListenerFactory));
234-
235-
if (builder is not MuninNodeBuilder muninNodeBuilder)
236-
throw new NotSupportedException($"The builder implementation of type `{builder.GetType().FullName}` does not support service key configuration.");
237-
238-
muninNodeBuilder.SetListenerFactory(buildListenerFactory);
239-
240-
return builder;
241-
}
242-
243-
internal static TMuninNode Build<TMuninNode>(
244-
this IMuninNodeBuilder builder,
245-
IServiceProvider serviceProvider
246-
) where TMuninNode : IMuninNode
247-
{
248-
if (builder is null)
249-
throw new ArgumentNullException(nameof(builder));
250-
if (serviceProvider is null)
251-
throw new ArgumentNullException(nameof(serviceProvider));
252-
253-
var n = builder.Build(serviceProvider);
254-
255-
if (n is not TMuninNode node)
256-
throw new InvalidOperationException($"The type '{n.GetType()}' of the constructed instance did not match the requested type '{typeof(TMuninNode)}'.");
257-
258-
return node;
259-
}
148+
=> MuninNodeBuilderExtensions.UseListenerFactory(
149+
builder: ThrowIfBuilderTypeIsNotSupported(builder ?? throw new ArgumentNullException(nameof(builder))),
150+
buildListenerFactory: buildListenerFactory ?? throw new ArgumentNullException(nameof(buildListenerFactory))
151+
);
260152
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ public static class IMuninServiceBuilderExtensions {
1515
/// An <see cref="IMuninServiceBuilder"/> that the built <c>Munin-Node</c> will be added to.
1616
/// </param>
1717
/// <returns>The current <see cref="IMuninNodeBuilder"/> so that additional calls can be chained.</returns>
18+
#pragma warning disable CS0618 // TODO: return IMuninNodeBuilder instead of MuninNodeBuilder
1819
public static IMuninNodeBuilder AddNode(
1920
this IMuninServiceBuilder builder
2021
)
22+
#pragma warning restore CS0618
2123
=> AddNode(
2224
builder: builder,
2325
configure: _ => { }
@@ -34,10 +36,12 @@ this IMuninServiceBuilder builder
3436
/// configure the <c>Munin-Node</c> to be built.
3537
/// </param>
3638
/// <returns>The current <see cref="IMuninNodeBuilder"/> so that additional calls can be chained.</returns>
39+
#pragma warning disable CS0618 // TODO: return IMuninNodeBuilder instead of MuninNodeBuilder
3740
public static IMuninNodeBuilder AddNode(
3841
this IMuninServiceBuilder builder,
3942
Action<MuninNodeOptions> configure
4043
)
44+
#pragma warning restore CS0618
4145
=> AddNode<
4246
IMuninNode,
4347
IMuninNode,

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,30 @@
1414

1515
namespace Smdn.Net.MuninNode.DependencyInjection;
1616

17+
/// <summary>
18+
/// Provides builder pattern for configuring and building the <c>Munin-Node</c>.
19+
/// </summary>
20+
/// <seealso cref="MuninNodeBuilderExtensions"/>
21+
#pragma warning disable CS0618 // TODO: remove IMuninNodeBuilder
1722
public class MuninNodeBuilder : IMuninNodeBuilder {
23+
#pragma warning restore CS0618
1824
private readonly List<Func<IServiceProvider, IPlugin>> pluginFactories = new(capacity: 4);
1925
private Func<IServiceProvider, IPluginProvider>? buildPluginProvider;
2026
private Func<IServiceProvider, INodeSessionCallback>? buildSessionCallback;
2127
private Func<IServiceProvider, IMuninNodeListenerFactory>? buildListenerFactory;
2228

29+
/// <summary>
30+
/// Gets the <see cref="IServiceCollection"/> where the <c>Munin-Node</c> services are configured.
31+
/// </summary>
2332
public IServiceCollection Services { get; }
33+
34+
/// <summary>
35+
/// Gets the <see cref="string"/> key of <c>Munin-Node</c> service.
36+
/// </summary>
37+
/// <remarks>
38+
/// The value set as the hostname of the <c>Munin-Node</c> (see <see cref="MuninNodeOptions.HostName"/>) is used as the service key.
39+
/// </remarks>
40+
/// <see cref="IMuninServiceBuilderExtensions.AddNode(IMuninServiceBuilder, Action{MuninNodeOptions})"/>
2441
public string ServiceKey { get; }
2542

2643
protected internal MuninNodeBuilder(IMuninServiceBuilder serviceBuilder, string serviceKey)
@@ -67,6 +84,13 @@ Func<IServiceProvider, IMuninNodeListenerFactory> buildListenerFactory
6784
this.buildListenerFactory = buildListenerFactory;
6885
}
6986

87+
/// <summary>
88+
/// Builds the <c>Munin-Node</c> with current configurations.
89+
/// </summary>
90+
/// <param name="serviceProvider">
91+
/// An <see cref="IServiceProvider"/> that provides the services to be used by the <see cref="IMuninNode"/> being built.
92+
/// </param>
93+
/// <returns>An initialized <see cref="IMuninNode"/>.</returns>
7094
public IMuninNode Build(IServiceProvider serviceProvider)
7195
{
7296
if (serviceProvider is null)

0 commit comments

Comments
 (0)