Skip to content
This repository was archived by the owner on Jul 28, 2025. It is now read-only.

Commit 2a998d1

Browse files
authored
refactor: tidy up DI registration (#27)
1 parent ca64c98 commit 2a998d1

File tree

7 files changed

+139
-63
lines changed

7 files changed

+139
-63
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using ServiceLayer.Common;
4+
5+
namespace ServiceLayer.Data;
6+
7+
internal static class ServiceCollectionExtensions
8+
{
9+
internal static IServiceCollection AddDbContext(this IServiceCollection services)
10+
{
11+
services.AddDbContext<ServiceLayerDbContext>(options =>
12+
{
13+
var connectionString = EnvironmentVariables.GetRequired("DatabaseConnectionString");
14+
15+
options.UseSqlServer(connectionString);
16+
});
17+
18+
return services;
19+
}
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using ServiceLayer.Data;
3+
4+
namespace ServiceLayer;
5+
6+
public static class ServiceCollectionExtensions
7+
{
8+
public static IServiceCollection AddCommonServices(this IServiceCollection services)
9+
{
10+
return services.AddDbContext();
11+
}
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
3+
namespace ServiceLayer.Mesh.Configuration;
4+
5+
internal static class ServiceCollectionExtensions
6+
{
7+
internal static IServiceCollection AddApplicationConfiguration(this IServiceCollection services)
8+
{
9+
services.AddTransient<IFileDiscoveryFunctionConfiguration, AppConfiguration>();
10+
services.AddTransient<IFileExtractQueueClientConfiguration, AppConfiguration>();
11+
services.AddTransient<IFileTransformQueueClientConfiguration, AppConfiguration>();
12+
services.AddTransient<IMeshHandshakeFunctionConfiguration, AppConfiguration>();
13+
services.AddTransient<IFileRetryFunctionConfiguration, AppConfiguration>();
14+
services.AddTransient<IFileTransformFunctionConfiguration, AppConfiguration>();
15+
16+
return services;
17+
}
18+
}

src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/ServiceCollectionExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33

44
namespace ServiceLayer.Mesh.FileTypes.NbssAppointmentEvents;
55

6-
public static class ServiceCollectionExtensions
6+
internal static class ServiceCollectionExtensions
77
{
8-
public static IServiceCollection ConfigureNbssAppointmentEvents(this IServiceCollection services)
8+
internal static IServiceCollection AddNbssAppointmentEventServices(this IServiceCollection services)
99
{
1010
services.AddTransient<IFileTransformer, FileTransformer>();
1111
services.AddTransient<IFileParser, FileParser>();
1212
services.AddTransient<IStagingPersister, StagingPersister>();
1313
services.AddSingleton<IValidationRunner, ValidationRunner>();
14-
services.RegisterValidators();
14+
services.AddValidators();
1515

1616
return services;
1717
}
1818

19-
private static IServiceCollection RegisterValidators(this IServiceCollection services)
19+
private static IServiceCollection AddValidators(this IServiceCollection services)
2020
{
2121
foreach (var recordValidator in ValidatorRegistry.GetAllRecordValidators())
2222
{
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Azure.Identity;
2+
using Azure.Storage.Queues;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using ServiceLayer.Common;
5+
6+
namespace ServiceLayer.Mesh.Messaging;
7+
8+
internal static class ServiceCollectionExtensions
9+
{
10+
internal static IServiceCollection AddMessagingServices(this IServiceCollection services, bool isLocalEnvironment)
11+
{
12+
var queueClientOptions = new QueueClientOptions
13+
{
14+
MessageEncoding = QueueMessageEncoding.Base64
15+
};
16+
17+
// Register QueueClients as singletons
18+
services.AddSingleton(_ =>
19+
{
20+
if (isLocalEnvironment)
21+
{
22+
var connectionString = EnvironmentVariables.GetRequired("AzureWebJobsStorage");
23+
return new QueueServiceClient(connectionString, queueClientOptions);
24+
}
25+
26+
var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl");
27+
return new QueueServiceClient(new Uri(meshStorageAccountUrl), new ManagedIdentityCredential(), queueClientOptions);
28+
});
29+
30+
services.AddSingleton<IFileExtractQueueClient, FileExtractQueueClient>();
31+
services.AddSingleton<IFileTransformQueueClient, FileTransformQueueClient>();
32+
33+
return services;
34+
}
35+
}

src/ServiceLayer.Mesh/Program.cs

Lines changed: 19 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
using Microsoft.Extensions.Hosting;
22
using Microsoft.Extensions.DependencyInjection;
3-
using Azure.Storage.Queues;
4-
using Azure.Identity;
5-
using Microsoft.EntityFrameworkCore;
63
using NHS.MESH.Client;
7-
using Azure.Storage.Blobs;
4+
using ServiceLayer;
85
using ServiceLayer.Mesh.Configuration;
96
using ServiceLayer.Mesh.Messaging;
10-
using ServiceLayer.Data;
117
using ServiceLayer.Mesh.Storage;
128
using ServiceLayer.Common;
139
using ServiceLayer.Mesh.FileTypes.NbssAppointmentEvents;
@@ -19,63 +15,15 @@
1915
var environment = EnvironmentVariables.GetRequired("ASPNETCORE_ENVIRONMENT");
2016
var isLocalEnvironment = environment == "Development";
2117

22-
// MESH Client config
23-
services
24-
.AddMeshClient(_ => _.MeshApiBaseUrl = EnvironmentVariables.GetRequired("MeshApiBaseUrl"))
25-
.AddMailbox(EnvironmentVariables.GetRequired("NbssMailboxId"), new NHS.MESH.Client.Configuration.MailboxConfiguration
26-
{
27-
Password = EnvironmentVariables.GetRequired("MeshPassword"),
28-
SharedKey = EnvironmentVariables.GetRequired("MeshSharedKey"),
29-
}).Build();
18+
ConfigureMeshClient(services);
3019

31-
// EF Core DbContext
32-
services.AddDbContext<ServiceLayerDbContext>(options =>
33-
{
34-
var connectionString = EnvironmentVariables.GetRequired("DatabaseConnectionString");
35-
if (string.IsNullOrEmpty(connectionString))
36-
throw new InvalidOperationException("The connection string has not been initialized.");
37-
38-
options.UseSqlServer(connectionString);
39-
});
40-
41-
var queueClientOptions = new QueueClientOptions
42-
{
43-
MessageEncoding = QueueMessageEncoding.Base64
44-
};
45-
46-
// Register QueueClients as singletons
47-
services.AddSingleton(provider =>
48-
{
49-
if (isLocalEnvironment)
50-
{
51-
var connectionString = EnvironmentVariables.GetRequired("AzureWebJobsStorage");
52-
return new QueueServiceClient(connectionString, queueClientOptions);
53-
}
54-
55-
var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl");
56-
return new QueueServiceClient(new Uri(meshStorageAccountUrl), new DefaultAzureCredential(), queueClientOptions);
57-
});
20+
services.AddCommonServices();
5821

59-
services.AddSingleton<IFileExtractQueueClient, FileExtractQueueClient>();
60-
services.AddSingleton<IFileTransformQueueClient, FileTransformQueueClient>();
22+
services.AddMessagingServices(isLocalEnvironment);
23+
services.AddStorageServices(isLocalEnvironment);
6124

62-
services.AddSingleton(provider =>
63-
{
64-
return new BlobContainerClient(
65-
EnvironmentVariables.GetRequired("AzureWebJobsStorage"),
66-
EnvironmentVariables.GetRequired("BlobContainerName"));
67-
});
68-
69-
services.AddSingleton<IMeshFilesBlobStore, MeshFilesBlobStore>();
70-
71-
services.AddTransient<IFileDiscoveryFunctionConfiguration, AppConfiguration>();
72-
services.AddTransient<IFileExtractQueueClientConfiguration, AppConfiguration>();
73-
services.AddTransient<IFileTransformQueueClientConfiguration, AppConfiguration>();
74-
services.AddTransient<IMeshHandshakeFunctionConfiguration, AppConfiguration>();
75-
services.AddTransient<IFileRetryFunctionConfiguration, AppConfiguration>();
76-
services.AddTransient<IFileTransformFunctionConfiguration, AppConfiguration>();
77-
78-
services.ConfigureNbssAppointmentEvents();
25+
services.AddApplicationConfiguration();
26+
services.AddNbssAppointmentEventServices();
7927
});
8028

8129

@@ -86,3 +34,15 @@
8634

8735
var app = host.Build();
8836
await app.RunAsync();
37+
return;
38+
39+
void ConfigureMeshClient(IServiceCollection services)
40+
{
41+
services
42+
.AddMeshClient(_ => _.MeshApiBaseUrl = EnvironmentVariables.GetRequired("MeshApiBaseUrl"))
43+
.AddMailbox(EnvironmentVariables.GetRequired("NbssMailboxId"), new NHS.MESH.Client.Configuration.MailboxConfiguration
44+
{
45+
Password = EnvironmentVariables.GetRequired("MeshPassword"),
46+
SharedKey = EnvironmentVariables.GetRequired("MeshSharedKey"),
47+
}).Build();
48+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using Azure.Identity;
2+
using Azure.Storage.Blobs;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using ServiceLayer.Common;
5+
6+
namespace ServiceLayer.Mesh.Storage;
7+
8+
internal static class ServiceCollectionExtensions
9+
{
10+
internal static IServiceCollection AddStorageServices(this IServiceCollection services, bool isLocalEnvironment)
11+
{
12+
services.AddSingleton(_ =>
13+
{
14+
var containerName = EnvironmentVariables.GetRequired("BlobContainerName");
15+
16+
if (isLocalEnvironment)
17+
{
18+
return new BlobContainerClient(EnvironmentVariables.GetRequired("AzureWebJobsStorage"),containerName);
19+
}
20+
21+
var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl");
22+
23+
var serviceClient = new BlobServiceClient(new Uri(meshStorageAccountUrl), new ManagedIdentityCredential());
24+
return serviceClient.GetBlobContainerClient(containerName);
25+
});
26+
27+
services.AddSingleton<IMeshFilesBlobStore, MeshFilesBlobStore>();
28+
29+
return services;
30+
}
31+
}

0 commit comments

Comments
 (0)