using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Threading; using System.Threading.Tasks; using Autofac; using InvestmentsServicesGateway.ServiceLibrary.Net5.Factories.ModelFactory.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.Factories.ModelFactory.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.FileProcessors.Implementations.Bancs; using InvestmentsServicesGateway.ServiceLibrary.Net5.FileProcessors.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.Global; using InvestmentsServicesGateway.ServiceLibrary.Net5.Helpers.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.Helpers.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.MessagingService.Receive.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.MessagingService.Receive.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.MessagingService.Send.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.MessagingService.Send.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.TradeStateProcessors.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.TradeStateProcessors.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.ViaNova.Convertors.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.ViaNova.Convertors.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.ViaNova.DocumentBuilder.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.ViaNova.DocumentBuilder.Interfaces; using InvestmentsServicesGateway.ServiceLibrary.Net5.XmlProcessors.Implementations; using InvestmentsServicesGateway.ServiceLibrary.Net5.XmlProcessors.Interfaces; using ISG.DAL; using ISG.DAL.Factories.Implementations; using ISG.DAL.Factories.Interfaces; using ISG.DAL.Implementations; using ISG.DAL.Interfaces; using ISG.Models.Enums; using ISG.Models.Internal; using log4net.Config; using Nimbus.InfrastructureContracts; using System.Collections.Generic; using System.Configuration; using System.Reflection; using Nimbus; using Microsoft.Extensions.Configuration; using log4net; using System.IO; using ISG.ServiceBus.Handlers.Net5; using Investments.ServiceBus.Messages.Net5.Messages; using Rpmi.Messaging.Azure.Core.Messages; using Investments.Models.Bancs; namespace ISG.ServiceBus.ReceiverNet5.WorkerService { public class Worker : BackgroundService { private readonly ILogger _logger; private static IContainer _container; private static string _endPointConnection = ConfigurationManager.AppSettings["ConnectionString"]; private static string _storageConnection = ConfigurationManager.AppSettings["AzureBlobStoreConnectionString"]; private static string _storageContainer = ConfigurationManager.AppSettings["AzureBlobStoreContainerName"]; private readonly Bus _bus; private readonly IConfiguration _configuration; private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private bool _busStarted; public Worker(ILogger logger, IConfiguration configuration) { _logger = logger; _configuration = configuration; // Load log4net configuration var logRepository = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); XmlConfigurator.Configure(new FileInfo(Path.Combine(logRepository, "app.config"))); //get the connections from the config GetConnections(); //configure the container StartContainer(); if (_container.Resolve() == null) throw new ArgumentNullException("bus"); var instance = _container.Resolve() as Bus; if (instance == null) throw new InvalidCastException("bus is not an instance of the Nimbus bus"); this._bus = instance; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { try { while (!stoppingToken.IsCancellationRequested) { if (!_busStarted) { await StartBus(); _log.Info($"ISG.ServiceBus.ReceiverNet5.WorkerService running at: {DateTimeOffset.Now}"); await Task.Delay(1000, stoppingToken); _busStarted = true; } } } catch(Exception e) { //await StopBus(); var exceptionType = e.GetType().FullName; var method = e.GetType().DeclaringMethod; var caller = e.GetType().AssemblyQualifiedName; _log.Error(e.Message, e); } } private void GetConnections() { _endPointConnection = _configuration.GetValue("Connections:AzureServiceBus:EndpointConnection"); _storageConnection = _configuration.GetValue("Connections:AzureStorage:StorageConnection"); _storageContainer = _configuration.GetValue("Connections:AzureStorage:StorageContainer"); } private void StartContainer() { //Log4net XmlConfigurator.Configure(); //Autofac _container = BuildContainer(); } private async Task StartBus() { try { await _bus.Start(Nimbus.Configuration.MessagePumpTypes.All); } catch (Exception e) { throw; } } private async Task StopBus() { //we have an error stop the bus instance await _bus.Stop(); } static IContainer BuildContainer() { var builder = new ContainerBuilder(); //The GlobalData object can be shared builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.Register(c => new InvestmentsServicesGatewayRepository(new InvestmentsServicesGatewayEntities())); //builder.RegisterType>().As>().InstancePerRequest(); //builder.RegisterType().As(); builder.RegisterGeneric(typeof(GenericRepository<>)) .As(typeof(IGenericRepository<>)); builder.RegisterGeneric(typeof(InvestmentXMLProcessor<>)) .As(typeof(IInvestmentXMLProcessor<>)); builder.RegisterType() .As() .Keyed(typeof(Investments.Models.Bancs.UnitHolding)); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); builder.RegisterType() .As() .Keyed(ViaNovaFileType.Redemption); builder.RegisterType() .As() .Keyed(ViaNovaFileType.Subscription); builder.RegisterType() .As() .Keyed(ViaNovaFileType.Switch); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); //*************************** // Trade Generic Repository //*************************** builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.Redemption); builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.Subscription); builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.Switch); builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.Tupe); builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.AvivaBrass1); builder.RegisterType() .As() .Keyed(Investments.Models.TradeType.AvivaBrass2); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); //**************** // Xml processors //**************** builder.RegisterType() .As() .Keyed(typeof(UnitTransferMessage)); builder.RegisterType() .As() .Keyed(typeof(AvivaTradeInstructionMessage)); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); //***************** // Model Factory //***************** builder.RegisterType() .As() .Keyed(typeof(AuditTradeState)); builder.RegisterType() .As() .Keyed(typeof(AvivaTrade)); builder.RegisterType() .As() .Keyed(typeof(ISG.DAL.UnitTransfer)); builder.RegisterType() .As() .Keyed(typeof(List)); builder.RegisterType() .As() .Keyed(typeof(TradeStatusModel)); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); //************************************** // Service Bus Via Nova Message Sender //************************************** builder.RegisterType() .As() .Keyed(ViaNovaFileType.ContractNote_Redemption); builder.RegisterType() .As() .Keyed(ViaNovaFileType.ContractNote_Subscription); builder.RegisterType() .As() .Keyed(ViaNovaFileType.ContractNote_Switch); builder.RegisterType() .As() .Keyed(ViaNovaFileType.PriceReport); builder.RegisterType() .As() .Keyed(ViaNovaFileType.UnitHoldings); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); //**************************** // Via Nova Document Merger //**************************** builder.RegisterType() .As() .Keyed(ViaNovaFileType.ContractNote_Redemption); builder.Register>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed(type); }); //****************************** // Trade State Sender Selector //****************************** builder.RegisterType() .As() .Keyed(OrderStateUpdateType.ViaNova); builder.RegisterType() .As() .Keyed(OrderStateUpdateType.Aviva); builder.Register>>(c => { var ctx = c.Resolve(); return type => !ctx.IsRegisteredWithKey(type) ? null : ctx.ResolveKeyed>(type); }); ****************************************************************************************** This calls the xstn method in the second namespace in the MainConfig ****************************************************************************************** builder.RegisterBusComponents(new[] { Assembly.GetAssembly(typeof(UnitHoldingMessage)), Assembly.GetAssembly(typeof(UnitHoldingMessageHandler)) } , "InvestmentsTradingGateway" , _endPointConnection , _storageConnection , _storageContainer , "" , 99 , null ); return builder.Build(); } } }