Skip to content
This repository was archived by the owner on Feb 6, 2026. It is now read-only.

Commit a6bf440

Browse files
authored
Remove duplicated configure services (#112)
1 parent 0a5c9a4 commit a6bf440

4 files changed

Lines changed: 57 additions & 91 deletions

File tree

src/Commands/CommandFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ private void RegisterMcpServerCommands()
253253
_rootGroup.AddSubGroup(mcpServer);
254254

255255
// Register MCP Server commands
256-
var startServer = new ServiceStartCommand(_serviceProvider);
256+
var startServer = new ServiceStartCommand();
257257
mcpServer.AddCommand("start", startServer);
258258

259259
}

src/Commands/Server/ServiceStartCommand.cs

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
using System.CommandLine.Parsing;
66
using System.Reflection;
77
using AzureMcp.Arguments.Server;
8-
using AzureMcp.Extensions;
98
using AzureMcp.Models;
109
using AzureMcp.Models.Argument;
1110
using AzureMcp.Models.Command;
12-
using AzureMcp.Services.Interfaces;
1311
using Microsoft.AspNetCore.Builder;
1412
using Microsoft.AspNetCore.Hosting;
1513
using Microsoft.Extensions.Azure;
@@ -25,9 +23,8 @@
2523
namespace AzureMcp.Commands.Server;
2624

2725
[HiddenCommand]
28-
public sealed class ServiceStartCommand(IServiceProvider serviceProvider) : BaseCommand
26+
public sealed class ServiceStartCommand : BaseCommand
2927
{
30-
private readonly IServiceProvider _serviceProvider = serviceProvider;
3128
private readonly Option<string> _transportOption = ArgumentDefinitions.Service.Transport.ToOption();
3229
private readonly Option<int> _portOption = ArgumentDefinitions.Service.Port.ToOption();
3330

@@ -73,7 +70,7 @@ private IHost CreateHost(ServiceStartArguments serverArguments)
7370
if (serverArguments.Transport == TransportTypes.Sse)
7471
{
7572
var builder = WebApplication.CreateBuilder([]);
76-
ConfigureServices(builder.Services, _serviceProvider);
73+
Program.ConfigureServices(builder.Services);
7774
ConfigureMcpServer(builder.Services, serverArguments.Transport);
7875

7976
builder.WebHost
@@ -99,7 +96,7 @@ private IHost CreateHost(ServiceStartArguments serverArguments)
9996
})
10097
.ConfigureServices(services =>
10198
{
102-
ConfigureServices(services, _serviceProvider);
99+
Program.ConfigureServices(services);
103100
ConfigureMcpServer(services, serverArguments.Transport);
104101
})
105102
.Build();
@@ -164,23 +161,6 @@ private static void ConfigureMcpServer(IServiceCollection services, string trans
164161
}
165162
}
166163

167-
private static void ConfigureServices(IServiceCollection services, IServiceProvider rootServiceProvider)
168-
{
169-
services.ConfigureOpenTelemetry();
170-
services.AddMemoryCache();
171-
services.AddSingleton(rootServiceProvider.GetRequiredService<CommandFactory>());
172-
services.AddSingleton(rootServiceProvider.GetRequiredService<ICacheService>());
173-
services.AddSingleton(rootServiceProvider.GetRequiredService<ISubscriptionService>());
174-
services.AddSingleton(rootServiceProvider.GetRequiredService<ITenantService>());
175-
services.AddSingleton(rootServiceProvider.GetRequiredService<IStorageService>());
176-
services.AddSingleton(rootServiceProvider.GetRequiredService<ICosmosService>());
177-
services.AddSingleton(rootServiceProvider.GetRequiredService<IMonitorService>());
178-
services.AddSingleton(rootServiceProvider.GetRequiredService<IResourceGroupService>());
179-
services.AddSingleton(rootServiceProvider.GetRequiredService<IAppConfigService>());
180-
services.AddSingleton(rootServiceProvider.GetRequiredService<IExternalProcessService>());
181-
services.AddSingleton(rootServiceProvider.GetRequiredService<ISearchService>());
182-
}
183-
184164
private sealed class StdioMcpServerHostedService(IMcpServer session) : BackgroundService
185165
{
186166
/// <inheritdoc />

src/Program.cs

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,48 +21,55 @@
2121
using Microsoft.Extensions.DependencyInjection;
2222
using Microsoft.Extensions.Logging;
2323

24-
try
24+
internal class Program
2525
{
26-
ServiceCollection services = new();
27-
ConfigureServices(services);
28-
var serviceProvider = services.BuildServiceProvider();
26+
private static async Task<int> Main(string[] args)
27+
{
28+
try
29+
{
30+
ServiceCollection services = new();
31+
ConfigureServices(services);
2932

30-
var commandFactory = serviceProvider.GetRequiredService<CommandFactory>();
31-
var rootCommand = commandFactory.RootCommand;
33+
services.AddLogging(builder =>
34+
{
35+
builder.AddConsole();
36+
builder.SetMinimumLevel(LogLevel.Information);
37+
});
3238

33-
return await rootCommand.InvokeAsync(args);
34-
}
35-
catch (Exception ex)
36-
{
37-
CommandResponse response = new()
38-
{
39-
Status = 500,
40-
Message = ex.Message,
41-
Duration = 0
42-
};
39+
var serviceProvider = services.BuildServiceProvider();
40+
var commandFactory = serviceProvider.GetRequiredService<CommandFactory>();
41+
var rootCommand = commandFactory.RootCommand;
4342

44-
Console.WriteLine(JsonSerializer.Serialize(response, ModelsJsonContext.Default.CommandResponse));
45-
return 1;
46-
}
43+
return await rootCommand.InvokeAsync(args);
44+
}
45+
catch (Exception ex)
46+
{
47+
CommandResponse response = new()
48+
{
49+
Status = 500,
50+
Message = ex.Message,
51+
Duration = 0
52+
};
4753

48-
static void ConfigureServices(IServiceCollection services)
49-
{
50-
services.ConfigureOpenTelemetry();
51-
services.AddMemoryCache();
52-
services.AddLogging(builder =>
54+
Console.WriteLine(JsonSerializer.Serialize(response, ModelsJsonContext.Default.CommandResponse));
55+
return 1;
56+
}
57+
}
58+
59+
internal static void ConfigureServices(IServiceCollection services)
5360
{
54-
builder.AddConsole();
55-
builder.SetMinimumLevel(LogLevel.Information);
56-
});
57-
services.AddSingleton<ICacheService, CacheService>();
58-
services.AddSingleton<IExternalProcessService, ExternalProcessService>();
59-
services.AddSingleton<ISubscriptionService, SubscriptionService>();
60-
services.AddSingleton<ITenantService, TenantService>();
61-
services.AddSingleton<ICosmosService, CosmosService>();
62-
services.AddSingleton<IStorageService, StorageService>();
63-
services.AddSingleton<IMonitorService, MonitorService>();
64-
services.AddSingleton<IResourceGroupService, ResourceGroupService>();
65-
services.AddSingleton<IAppConfigService, AppConfigService>();
66-
services.AddSingleton<ISearchService, SearchService>();
67-
services.AddSingleton<CommandFactory>();
61+
services.ConfigureOpenTelemetry();
62+
services.AddMemoryCache();
63+
services.AddSingleton<ICacheService, CacheService>();
64+
services.AddSingleton<IExternalProcessService, ExternalProcessService>();
65+
services.AddSingleton<ISubscriptionService, SubscriptionService>();
66+
services.AddSingleton<ITenantService, TenantService>();
67+
services.AddSingleton<ICosmosService, CosmosService>();
68+
services.AddSingleton<IStorageService, StorageService>();
69+
services.AddSingleton<IMonitorService, MonitorService>();
70+
services.AddSingleton<IResourceGroupService, ResourceGroupService>();
71+
services.AddSingleton<IAppConfigService, AppConfigService>();
72+
services.AddSingleton<ISearchService, SearchService>();
73+
services.AddSingleton<CommandFactory>();
74+
}
6875
}

tests/Commands/Server/ServiceStartCommandTests.cs

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,36 @@
22
// Licensed under the MIT License.
33

44
using AzureMcp.Models.Argument;
5-
using AzureMcp.Services.Interfaces;
6-
using Microsoft.Extensions.DependencyInjection;
7-
using NSubstitute;
85
using Xunit;
96

107
namespace AzureMcp.Commands.Server.Tests;
118

129
public class ServiceStartCommandTests
1310
{
14-
private readonly IServiceProvider _serviceProvider;
1511
private readonly ServiceStartCommand _command;
1612

1713
public ServiceStartCommandTests()
1814
{
19-
var services = new ServiceCollection();
20-
services.AddSingleton(Substitute.For<ICacheService>());
21-
services.AddSingleton(Substitute.For<ISubscriptionService>());
22-
services.AddSingleton(Substitute.For<IStorageService>());
23-
services.AddSingleton(Substitute.For<ICosmosService>());
24-
services.AddSingleton(Substitute.For<IMonitorService>());
25-
services.AddSingleton(Substitute.For<IResourceGroupService>());
26-
services.AddSingleton(Substitute.For<IAppConfigService>());
27-
services.AddSingleton<CommandFactory>();
28-
29-
_serviceProvider = services.BuildServiceProvider();
30-
_command = new(_serviceProvider);
15+
_command = new();
3116
}
3217

3318
[Fact]
3419
public void Constructor_InitializesCommandCorrectly()
3520
{
3621
// Arrange & Act
37-
var command = new ServiceStartCommand(_serviceProvider);
3822

3923
// Assert
40-
Assert.Equal("start", command.GetCommand().Name);
41-
Assert.Equal("Starts Azure MCP Server.", command.GetCommand().Description);
24+
Assert.Equal("start", _command.GetCommand().Name);
25+
Assert.Equal("Starts Azure MCP Server.", _command.GetCommand().Description);
4226
}
4327

4428
[Fact]
4529
public void GetArguments_ReturnsExpectedArguments()
4630
{
4731
// Arrange
48-
var command = new ServiceStartCommand(_serviceProvider);
4932

5033
// Act
51-
var args = command.GetArguments()?.ToList();
34+
var args = _command.GetArguments()?.ToList();
5235

5336
// Assert
5437
Assert.NotNull(args);
@@ -60,14 +43,11 @@ public void GetArguments_ReturnsExpectedArguments()
6043
[Fact]
6144
public void ClearArguments_RemovesAllArguments()
6245
{
63-
// Arrange
64-
var command = new ServiceStartCommand(_serviceProvider);
65-
6646
// Act
67-
command.ClearArguments();
47+
_command.ClearArguments();
6848

6949
// Assert
70-
var arguments = command.GetArguments();
50+
var arguments = _command.GetArguments();
7151
Assert.NotNull(arguments);
7252
Assert.Empty(arguments);
7353
}
@@ -76,16 +56,15 @@ public void ClearArguments_RemovesAllArguments()
7656
public void AddArgument_AddsNewArgument()
7757
{
7858
// Arrange
79-
var command = new ServiceStartCommand(_serviceProvider);
8059
var newArg = new ArgumentDefinition<string>("test", "test description");
81-
var arguments = command.GetArguments();
60+
var arguments = _command.GetArguments();
8261

8362
Assert.NotNull(arguments);
8463

8564
var initialCount = arguments.Count();
8665

8766
// Act
88-
command.AddArgument(newArg);
67+
_command.AddArgument(newArg);
8968

9069
// Assert
9170
Assert.Equal(initialCount + 1, arguments.Count());

0 commit comments

Comments
 (0)