diff --git a/src/ServiceLayer.Common/Data/ServiceCollectionExtensions.cs b/src/ServiceLayer.Common/Data/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..1693c09 --- /dev/null +++ b/src/ServiceLayer.Common/Data/ServiceCollectionExtensions.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using ServiceLayer.Common; + +namespace ServiceLayer.Data; + +internal static class ServiceCollectionExtensions +{ + internal static IServiceCollection AddDbContext(this IServiceCollection services) + { + services.AddDbContext(options => + { + var connectionString = EnvironmentVariables.GetRequired("DatabaseConnectionString"); + + options.UseSqlServer(connectionString); + }); + + return services; + } +} diff --git a/src/ServiceLayer.Common/ServiceCollectionExtensions.cs b/src/ServiceLayer.Common/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..c8af9f6 --- /dev/null +++ b/src/ServiceLayer.Common/ServiceCollectionExtensions.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.DependencyInjection; +using ServiceLayer.Data; + +namespace ServiceLayer; + +public static class ServiceCollectionExtensions +{ + public static IServiceCollection AddCommonServices(this IServiceCollection services) + { + return services.AddDbContext(); + } +} diff --git a/src/ServiceLayer.Mesh/Configuration/ServiceCollectionExtensions.cs b/src/ServiceLayer.Mesh/Configuration/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..8361f31 --- /dev/null +++ b/src/ServiceLayer.Mesh/Configuration/ServiceCollectionExtensions.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace ServiceLayer.Mesh.Configuration; + +internal static class ServiceCollectionExtensions +{ + internal static IServiceCollection AddApplicationConfiguration(this IServiceCollection services) + { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + return services; + } +} diff --git a/src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/ServiceCollectionExtensions.cs b/src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/ServiceCollectionExtensions.cs index 2e05d24..6b3d3e9 100644 --- a/src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/ServiceCollectionExtensions.cs +++ b/src/ServiceLayer.Mesh/FileTypes/NbssAppointmentEvents/ServiceCollectionExtensions.cs @@ -3,20 +3,20 @@ namespace ServiceLayer.Mesh.FileTypes.NbssAppointmentEvents; -public static class ServiceCollectionExtensions +internal static class ServiceCollectionExtensions { - public static IServiceCollection ConfigureNbssAppointmentEvents(this IServiceCollection services) + internal static IServiceCollection AddNbssAppointmentEventServices(this IServiceCollection services) { services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddSingleton(); - services.RegisterValidators(); + services.AddValidators(); return services; } - private static IServiceCollection RegisterValidators(this IServiceCollection services) + private static IServiceCollection AddValidators(this IServiceCollection services) { foreach (var recordValidator in ValidatorRegistry.GetAllRecordValidators()) { diff --git a/src/ServiceLayer.Mesh/Messaging/ServiceCollectionExtensions.cs b/src/ServiceLayer.Mesh/Messaging/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..4b17a25 --- /dev/null +++ b/src/ServiceLayer.Mesh/Messaging/ServiceCollectionExtensions.cs @@ -0,0 +1,35 @@ +using Azure.Identity; +using Azure.Storage.Queues; +using Microsoft.Extensions.DependencyInjection; +using ServiceLayer.Common; + +namespace ServiceLayer.Mesh.Messaging; + +internal static class ServiceCollectionExtensions +{ + internal static IServiceCollection AddMessagingServices(this IServiceCollection services, bool isLocalEnvironment) + { + var queueClientOptions = new QueueClientOptions + { + MessageEncoding = QueueMessageEncoding.Base64 + }; + + // Register QueueClients as singletons + services.AddSingleton(_ => + { + if (isLocalEnvironment) + { + var connectionString = EnvironmentVariables.GetRequired("AzureWebJobsStorage"); + return new QueueServiceClient(connectionString, queueClientOptions); + } + + var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl"); + return new QueueServiceClient(new Uri(meshStorageAccountUrl), new ManagedIdentityCredential(), queueClientOptions); + }); + + services.AddSingleton(); + services.AddSingleton(); + + return services; + } +} diff --git a/src/ServiceLayer.Mesh/Program.cs b/src/ServiceLayer.Mesh/Program.cs index 3c2c604..e252f52 100644 --- a/src/ServiceLayer.Mesh/Program.cs +++ b/src/ServiceLayer.Mesh/Program.cs @@ -1,13 +1,9 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; -using Azure.Storage.Queues; -using Azure.Identity; -using Microsoft.EntityFrameworkCore; using NHS.MESH.Client; -using Azure.Storage.Blobs; +using ServiceLayer; using ServiceLayer.Mesh.Configuration; using ServiceLayer.Mesh.Messaging; -using ServiceLayer.Data; using ServiceLayer.Mesh.Storage; using ServiceLayer.Common; using ServiceLayer.Mesh.FileTypes.NbssAppointmentEvents; @@ -19,63 +15,15 @@ var environment = EnvironmentVariables.GetRequired("ASPNETCORE_ENVIRONMENT"); var isLocalEnvironment = environment == "Development"; - // MESH Client config - services - .AddMeshClient(_ => _.MeshApiBaseUrl = EnvironmentVariables.GetRequired("MeshApiBaseUrl")) - .AddMailbox(EnvironmentVariables.GetRequired("NbssMailboxId"), new NHS.MESH.Client.Configuration.MailboxConfiguration - { - Password = EnvironmentVariables.GetRequired("MeshPassword"), - SharedKey = EnvironmentVariables.GetRequired("MeshSharedKey"), - }).Build(); + ConfigureMeshClient(services); - // EF Core DbContext - services.AddDbContext(options => - { - var connectionString = EnvironmentVariables.GetRequired("DatabaseConnectionString"); - if (string.IsNullOrEmpty(connectionString)) - throw new InvalidOperationException("The connection string has not been initialized."); - - options.UseSqlServer(connectionString); - }); - - var queueClientOptions = new QueueClientOptions - { - MessageEncoding = QueueMessageEncoding.Base64 - }; - - // Register QueueClients as singletons - services.AddSingleton(provider => - { - if (isLocalEnvironment) - { - var connectionString = EnvironmentVariables.GetRequired("AzureWebJobsStorage"); - return new QueueServiceClient(connectionString, queueClientOptions); - } - - var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl"); - return new QueueServiceClient(new Uri(meshStorageAccountUrl), new DefaultAzureCredential(), queueClientOptions); - }); + services.AddCommonServices(); - services.AddSingleton(); - services.AddSingleton(); + services.AddMessagingServices(isLocalEnvironment); + services.AddStorageServices(isLocalEnvironment); - services.AddSingleton(provider => - { - return new BlobContainerClient( - EnvironmentVariables.GetRequired("AzureWebJobsStorage"), - EnvironmentVariables.GetRequired("BlobContainerName")); - }); - - services.AddSingleton(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.ConfigureNbssAppointmentEvents(); + services.AddApplicationConfiguration(); + services.AddNbssAppointmentEventServices(); }); @@ -86,3 +34,15 @@ var app = host.Build(); await app.RunAsync(); +return; + +void ConfigureMeshClient(IServiceCollection services) +{ + services + .AddMeshClient(_ => _.MeshApiBaseUrl = EnvironmentVariables.GetRequired("MeshApiBaseUrl")) + .AddMailbox(EnvironmentVariables.GetRequired("NbssMailboxId"), new NHS.MESH.Client.Configuration.MailboxConfiguration + { + Password = EnvironmentVariables.GetRequired("MeshPassword"), + SharedKey = EnvironmentVariables.GetRequired("MeshSharedKey"), + }).Build(); +} diff --git a/src/ServiceLayer.Mesh/Storage/ServiceCollectionExtensions.cs b/src/ServiceLayer.Mesh/Storage/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..bdc541c --- /dev/null +++ b/src/ServiceLayer.Mesh/Storage/ServiceCollectionExtensions.cs @@ -0,0 +1,31 @@ +using Azure.Identity; +using Azure.Storage.Blobs; +using Microsoft.Extensions.DependencyInjection; +using ServiceLayer.Common; + +namespace ServiceLayer.Mesh.Storage; + +internal static class ServiceCollectionExtensions +{ + internal static IServiceCollection AddStorageServices(this IServiceCollection services, bool isLocalEnvironment) + { + services.AddSingleton(_ => + { + var containerName = EnvironmentVariables.GetRequired("BlobContainerName"); + + if (isLocalEnvironment) + { + return new BlobContainerClient(EnvironmentVariables.GetRequired("AzureWebJobsStorage"),containerName); + } + + var meshStorageAccountUrl = EnvironmentVariables.GetRequired("MeshStorageAccountUrl"); + + var serviceClient = new BlobServiceClient(new Uri(meshStorageAccountUrl), new ManagedIdentityCredential()); + return serviceClient.GetBlobContainerClient(containerName); + }); + + services.AddSingleton(); + + return services; + } +}