public IEnumerable<AssemblyRegistration> GetAssemblyRegistrations() { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve; var scanner = new AssemblyScanner(); scanner.ExcludeFileNameStartsWith("Topshelf.", "NewId.", "Newtonsoft.", "log4net.", "NLog.", "Autofac.", "RabbitMQ.", "Microsoft.", "System.", "SQLite."); scanner.Include(IsSupportedType); try { scanner.AssembliesFromApplicationBaseDirectory(); var typeSet = scanner.ScanForTypes().Result; List<AssemblyRegistration> registrations = typeSet.FindTypes(TypeClassification.Concrete | TypeClassification.Closed) .GroupBy(x => x.Assembly) .Select(x => new AssemblyRegistration(x.Key, x.ToArray())) .ToList(); return registrations; } finally { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve; } }
public bool Start(HostControl hostControl) { _log.InfoFormat($"Starting {GetType().GetDisplayName()}"); var started = new List<ServiceControl>(); try { var scanner = new AssemblyScanner(); List<AssemblyRegistration> registrations = scanner.GetAssemblyRegistrations().ToList(); _log.Info($"Found {registrations.Count} assembly registrations"); foreach (var registration in registrations) { _log.Info($"Assembly: {registration.Assembly.GetName().Name}"); foreach (var type in registration.Types) _log.Info($" Type: {type.GetTypeName()}"); } var busFactoryType = scanner.GetHostBusFactoryType(); if (busFactoryType == null) throw new ConfigurationException("A valid transport assembly was not found."); _bootstrapperScope = CreateBootstrapperScope(registrations, busFactoryType); var bootstrappers = _bootstrapperScope.Resolve<IEnumerable<IServiceBootstrapper>>(); List<ServiceControl> services = bootstrappers.Select(x => x.CreateService()).ToList(); Parallel.ForEach(services, serviceControl => { hostControl.RequestAdditionalTime(TimeSpan.FromMinutes(1)); StartService(hostControl, serviceControl); lock (started) { started.Add(serviceControl); } }); _services.AddRange(started); return true; } catch (Exception ex) { _log.Error("Service failed to start", ex); Parallel.ForEach(started, service => { hostControl.RequestAdditionalTime(TimeSpan.FromMinutes(1)); StopService(hostControl, service); }); throw; } }
public Type GetHostBusFactoryType() { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve; try { var scanner = new AssemblyScanner(); scanner.IncludeFileNameStartsWith("MassTransit."); scanner.Include(IsHostBusFactoryType); scanner.AssembliesFromApplicationBaseDirectory(); var typeSet = scanner.ScanForTypes().Result; var busFactoryType = typeSet.FindTypes(TypeClassification.Concrete | TypeClassification.Closed) .FirstOrDefault(); return busFactoryType; } finally { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve; } }
public Type GetHostBusFactoryType() { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += CurrentDomain_ReflectionOnlyAssemblyResolve; try { var scanner = new AssemblyScanner(); scanner.IncludeFileNameStartsWith("MassTransit."); scanner.Include(IsHostBusFactoryType); scanner.AssembliesFromApplicationBaseDirectory(); var typeSet = scanner.ScanForTypes().Result; var busFactoryType = typeSet.FindTypes(TypeClassification.Concrete | TypeClassification.Closed) .FirstOrDefault(); return(busFactoryType); } finally { AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve -= CurrentDomain_ReflectionOnlyAssemblyResolve; } }
public bool Start(HostControl hostControl) { _log.InfoFormat($"Starting {GetType().GetDisplayName()}"); var started = new List <ServiceControl>(); try { var scanner = new AssemblyScanner(); List <AssemblyRegistration> registrations = scanner.GetAssemblyRegistrations().ToList(); _log.Info($"Found {registrations.Count} assembly registrations"); foreach (var registration in registrations) { _log.Info($"Assembly: {registration.Assembly.GetName().Name}"); foreach (var type in registration.Types) { _log.Info($" Type: {type.GetTypeName()}"); } } var busFactoryType = scanner.GetHostBusFactoryType(); if (busFactoryType == null) { throw new ConfigurationException("A valid transport assembly was not found."); } _bootstrapperScope = CreateBootstrapperScope(registrations, busFactoryType); var bootstrappers = _bootstrapperScope.Resolve <IEnumerable <IServiceBootstrapper> >(); List <ServiceControl> services = bootstrappers.Select(x => x.CreateService()).ToList(); Parallel.ForEach(services, serviceControl => { hostControl.RequestAdditionalTime(TimeSpan.FromMinutes(1)); StartService(hostControl, serviceControl); lock (started) { started.Add(serviceControl); } }); _services.AddRange(started); return(true); } catch (Exception ex) { _log.Error("Service failed to start", ex); Parallel.ForEach(started, service => { hostControl.RequestAdditionalTime(TimeSpan.FromMinutes(1)); StopService(hostControl, service); }); throw; } }