Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 28 additions & 28 deletions TransactionProcessor.Tests/General/BootstrapperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Lamar;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
Expand All @@ -28,15 +29,13 @@ public void VerifyBootstrapperIsValid()
hostingEnvironment.Setup(he => he.ContentRootPath).Returns("/home");
hostingEnvironment.Setup(he => he.ApplicationName).Returns("Test Application");

IServiceCollection services = new ServiceCollection();
ServiceRegistry services = new ServiceRegistry();
Startup s = new Startup(hostingEnvironment.Object);
Startup.Configuration = this.SetupMemoryConfiguration();

s.ConfigureServices(services);

this.AddTestRegistrations(services, hostingEnvironment.Object);

services.AssertConfigurationIsValid();
s.ConfigureContainer(services);
Startup.Container.AssertConfigurationIsValid(AssertMode.Full);
}

private IConfigurationRoot SetupMemoryConfiguration()
Expand All @@ -51,6 +50,7 @@ private IConfigurationRoot SetupMemoryConfiguration()
configuration.Add("AppSettings:ClientId", "clientId");
configuration.Add("AppSettings:ClientSecret", "clientSecret");
configuration.Add("AppSettings:EstateManagementApi", "http://localhost");
configuration.Add("AppSettings:VoucherManagementApi", "http://localhost");
configuration.Add("AppSettings:SecurityService", "http://localhost");
configuration.Add("SecurityConfiguration:Authority", "http://localhost");

Expand All @@ -77,27 +77,27 @@ private void AddTestRegistrations(IServiceCollection services,
#endregion
}

public static class ServiceCollectionExtensions
{
public static void AssertConfigurationIsValid(this IServiceCollection serviceCollection,
List<Type> typesToIgnore = null)
{
ServiceProvider buildServiceProvider = serviceCollection.BuildServiceProvider();

List<ServiceDescriptor> list = serviceCollection.Where(x => x.ServiceType.Namespace != null && x.ServiceType.Namespace.Contains("Vme")).ToList();

if (typesToIgnore != null)
{
list.RemoveAll(listItem => typesToIgnore.Contains(listItem.ServiceType));
}

foreach (ServiceDescriptor serviceDescriptor in list)
{
Type type = serviceDescriptor.ServiceType;

//This throws an Exception if the type cannot be instantiated.
buildServiceProvider.GetService(type);
}
}
}
//public static class ServiceCollectionExtensions
//{
// public static void AssertConfigurationIsValid(this IServiceCollection serviceCollection,
// List<Type> typesToIgnore = null)
// {
// ServiceProvider buildServiceProvider = serviceCollection.BuildServiceProvider();

// List<ServiceDescriptor> list = serviceCollection.Where(x => x.ServiceType.Namespace != null && x.ServiceType.Namespace.Contains("Vme")).ToList();

// if (typesToIgnore != null)
// {
// list.RemoveAll(listItem => typesToIgnore.Contains(listItem.ServiceType));
// }

// foreach (ServiceDescriptor serviceDescriptor in list)
// {
// Type type = serviceDescriptor.ServiceType;

// //This throws an Exception if the type cannot be instantiated.
// buildServiceProvider.GetService(type);
// }
// }
//}
}
49 changes: 49 additions & 0 deletions TransactionProcessor/Bootstrapper/ClientRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
namespace TransactionProcessor.Bootstrapper
{
using System;
using System.Net.Http;
using EstateManagement.Client;
using Lamar;
using MessagingService.Client;
using Microsoft.Extensions.DependencyInjection;
using SecurityService.Client;
using Shared.General;
using VoucherManagement.Client;

/// <summary>
///
/// </summary>
/// <seealso cref="Lamar.ServiceRegistry" />
public class ClientRegistry : ServiceRegistry
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="ClientRegistry"/> class.
/// </summary>
public ClientRegistry()
{
this.AddSingleton<ISecurityServiceClient, SecurityServiceClient>();
this.AddSingleton<IMessagingServiceClient, MessagingServiceClient>();
this.AddSingleton<IEstateClient, EstateClient>();
this.AddSingleton<IVoucherManagementClient, VoucherManagementClient>();

this.AddSingleton<Func<String, String>>(container => serviceName => { return ConfigurationReader.GetBaseServerUri(serviceName).OriginalString; });

var httpMessageHandler = new SocketsHttpHandler
{
SslOptions =
{
RemoteCertificateValidationCallback = (sender,
certificate,
chain,
errors) => true,
}
};
HttpClient httpClient = new HttpClient(httpMessageHandler);
this.AddSingleton(httpClient);
}

#endregion
}
}
50 changes: 50 additions & 0 deletions TransactionProcessor/Bootstrapper/DomainEventHandlerRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
namespace TransactionProcessor.Bootstrapper
{
using System;
using System.Collections.Generic;
using BusinessLogic.EventHandling;
using Lamar;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Shared.EventStore.EventHandling;

/// <summary>
///
/// </summary>
/// <seealso cref="Lamar.ServiceRegistry" />
public class DomainEventHandlerRegistry : ServiceRegistry
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="DomainEventHandlerRegistry"/> class.
/// </summary>
public DomainEventHandlerRegistry()
{
Dictionary<String, String[]> eventHandlersConfiguration = new Dictionary<String, String[]>();

if (Startup.Configuration != null)
{
IConfigurationSection section = Startup.Configuration.GetSection("AppSettings:EventHandlerConfiguration");

if (section != null)
{
Startup.Configuration.GetSection("AppSettings:EventHandlerConfiguration").Bind(eventHandlersConfiguration);
}
}

this.AddSingleton(eventHandlersConfiguration);

this.AddSingleton<Func<Type, IDomainEventHandler>>(container => type =>
{
IDomainEventHandler handler = container.GetService(type) as IDomainEventHandler;
return handler;
});

this.AddSingleton<TransactionDomainEventHandler>();
this.AddSingleton<IDomainEventHandlerResolver, DomainEventHandlerResolver>();
}

#endregion
}
}
26 changes: 26 additions & 0 deletions TransactionProcessor/Bootstrapper/DomainServiceRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
namespace TransactionProcessor.Bootstrapper
{
using BusinessLogic.Services;
using Lamar;
using Microsoft.Extensions.DependencyInjection;

/// <summary>
///
/// </summary>
/// <seealso cref="Lamar.ServiceRegistry" />
public class DomainServiceRegistry : ServiceRegistry
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="DomainServiceRegistry"/> class.
/// </summary>
public DomainServiceRegistry()
{
this.AddSingleton<ITransactionDomainService, TransactionDomainService>();
this.AddSingleton<ISettlementDomainService, SettlementDomainService>();
}

#endregion
}
}
37 changes: 37 additions & 0 deletions TransactionProcessor/Bootstrapper/MediatorRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace TransactionProcessor.Bootstrapper
{
using BusinessLogic.RequestHandlers;
using BusinessLogic.Requests;
using Lamar;
using MediatR;
using Microsoft.Extensions.DependencyInjection;
using Models;

/// <summary>
///
/// </summary>
/// <seealso cref="Lamar.ServiceRegistry" />
public class MediatorRegistry : ServiceRegistry
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="MediatorRegistry"/> class.
/// </summary>
public MediatorRegistry()
{
this.AddTransient<IMediator, Mediator>();

// request & notification handlers
this.AddTransient<ServiceFactory>(context => { return t => context.GetService(t); });

this.AddSingleton<IRequestHandler<ProcessLogonTransactionRequest, ProcessLogonTransactionResponse>, TransactionRequestHandler>();
this.AddSingleton<IRequestHandler<ProcessSaleTransactionRequest, ProcessSaleTransactionResponse>, TransactionRequestHandler>();
this.AddSingleton<IRequestHandler<ProcessReconciliationRequest, ProcessReconciliationTransactionResponse>, TransactionRequestHandler>();

this.AddSingleton<IRequestHandler<ProcessSettlementRequest, ProcessSettlementResponse>, SettlementRequestHandler>();
}

#endregion
}
}
141 changes: 141 additions & 0 deletions TransactionProcessor/Bootstrapper/MiddlewareRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
namespace TransactionProcessor.Bootstrapper
{
using System;
using System.IO;
using System.Net.Http;
using System.Reflection;
using Common;
using Lamar;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Shared.EventStore.Extensions;
using Shared.Extensions;
using Shared.General;
using Swashbuckle.AspNetCore.Filters;

/// <summary>
///
/// </summary>
/// <seealso cref="Lamar.ServiceRegistry" />
public class MiddlewareRegistry : ServiceRegistry
{
#region Constructors

/// <summary>
/// Initializes a new instance of the <see cref="MiddlewareRegistry"/> class.
/// </summary>
public MiddlewareRegistry()
{
this.AddHealthChecks()
.AddEventStore(Startup.EventStoreClientSettings,
userCredentials:Startup.EventStoreClientSettings.DefaultCredentials,
name:"Eventstore",
failureStatus:HealthStatus.Unhealthy,
tags:new[] {"db", "eventstore"}).AddSecurityService(this.ApiEndpointHttpHandler).AddEstateManagementService();

this.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1",
new OpenApiInfo
{
Title = "Transaction Processor API",
Version = "1.0",
Description = "A REST Api to manage the processing and routing of transactions to local and remote operators.",
Contact = new OpenApiContact
{
Name = "Stuart Ferguson",
Email = "golfhandicapping@btinternet.com"
}
});
// add a custom operation filter which sets default values
c.OperationFilter<SwaggerDefaultValues>();
c.ExampleFilters();

//Locate the XML files being generated by ASP.NET...
var directory = new DirectoryInfo(AppContext.BaseDirectory);
var xmlFiles = directory.GetFiles("*.xml");

//... and tell Swagger to use those XML comments.
foreach (FileInfo fileInfo in xmlFiles)
{
c.IncludeXmlComments(fileInfo.FullName);
}
});

this.AddSwaggerExamplesFromAssemblyOf<SwaggerJsonConverter>();

IdentityModelEventSource.ShowPII = true;

this.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.BackchannelHttpHandler = new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message,
certificate,
chain,
sslPolicyErrors) => true
};
options.Authority = ConfigurationReader.GetValue("SecurityConfiguration", "Authority");
options.Audience = ConfigurationReader.GetValue("SecurityConfiguration", "ApiName");

options.TokenValidationParameters = new TokenValidationParameters
{
ValidateAudience = false,
ValidAudience =
ConfigurationReader.GetValue("SecurityConfiguration", "ApiName"),
ValidIssuer =
ConfigurationReader.GetValue("SecurityConfiguration", "Authority"),
};
options.IncludeErrorDetails = true;
});

this.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
options.SerializerSettings.Formatting = Formatting.Indented;
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

Assembly assembly = this.GetType().GetTypeInfo().Assembly;
this.AddMvcCore().AddApplicationPart(assembly).AddControllersAsServices();
}

#endregion

#region Methods

/// <summary>
/// APIs the endpoint HTTP handler.
/// </summary>
/// <param name="serviceProvider">The service provider.</param>
/// <returns></returns>
private HttpClientHandler ApiEndpointHttpHandler(IServiceProvider serviceProvider)
{
return new HttpClientHandler
{
ServerCertificateCustomValidationCallback = (message,
cert,
chain,
errors) =>
{
return true;
}
};
}

#endregion
}
}
Loading