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

Commit 109bcd6

Browse files
committed
Merge branch 'main' into refactor/shared-not-common
2 parents 0f59fec + 2a998d1 commit 109bcd6

File tree

8 files changed

+138
-65
lines changed

8 files changed

+138
-65
lines changed

compose.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ services:
22
api:
33
container_name: "api"
44
build:
5-
context: ./Src
5+
context: ./src
66
dockerfile: ServiceLayer.API/Dockerfile
77
platform: linux/amd64
88
restart: always
@@ -33,7 +33,7 @@ services:
3333
mesh-ingest:
3434
container_name: "mesh-ingest"
3535
build:
36-
context: ./Src
36+
context: ./src
3737
dockerfile: ServiceLayer.MESH/Dockerfile
3838
platform: linux/amd64
3939
restart: always
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: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using Azure.Identity;
2+
using Azure.Storage.Queues;
3+
using Microsoft.Extensions.DependencyInjection;
4+
5+
namespace ServiceLayer.Mesh.Messaging;
6+
7+
internal static class ServiceCollectionExtensions
8+
{
9+
internal static IServiceCollection AddMessagingServices(this IServiceCollection services, bool isLocalEnvironment)
10+
{
11+
var queueClientOptions = new QueueClientOptions
12+
{
13+
MessageEncoding = QueueMessageEncoding.Base64
14+
};
15+
16+
// Register QueueClients as singletons
17+
services.AddSingleton(_ =>
18+
{
19+
if (isLocalEnvironment)
20+
{
21+
var connectionString = EnvironmentVariables.GetRequired("AzureWebJobsStorage");
22+
return new QueueServiceClient(connectionString, queueClientOptions);
23+
}
24+
25+
var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl");
26+
return new QueueServiceClient(new Uri(meshStorageAccountUrl), new ManagedIdentityCredential(), queueClientOptions);
27+
});
28+
29+
services.AddSingleton<IFileExtractQueueClient, FileExtractQueueClient>();
30+
services.AddSingleton<IFileTransformQueueClient, FileTransformQueueClient>();
31+
32+
return services;
33+
}
34+
}

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.Mesh.FileTypes.NbssAppointmentEvents;
139

@@ -18,63 +14,15 @@
1814
var environment = EnvironmentVariables.GetRequired("ASPNETCORE_ENVIRONMENT");
1915
var isLocalEnvironment = environment == "Development";
2016

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

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

58-
services.AddSingleton<IFileExtractQueueClient, FileExtractQueueClient>();
59-
services.AddSingleton<IFileTransformQueueClient, FileTransformQueueClient>();
21+
services.AddMessagingServices(isLocalEnvironment);
22+
services.AddStorageServices(isLocalEnvironment);
6023

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

8028

@@ -85,3 +33,15 @@
8533

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

0 commit comments

Comments
 (0)