public Type[] GetControllerTypes(IEnumerable <ServiceInfo> services) { var result = _webApiGenerator.Generate(services); DynamicAssembly assembly = new DynamicAssembly(_eventHub); assembly.AppendSourceUnits(result); assembly.AddWebApiReferences(); AssemblyPurpose p = AssemblyPurpose.Handlers | AssemblyPurpose.Commands | AssemblyPurpose.Queries | AssemblyPurpose.Results; assembly.AddReferenceFrom(_dynamicPool.Where(x => (x.Purpose & p) > 0).Select(x => x.Assembly)); _dynamicPool.AddOrReplace(assembly); assembly.Compile(); var controllerTypes = assembly.Assembly.GetTypes() .Where(x => typeof(ControllerBase).IsAssignableFrom(x)) .ToArray(); return(controllerTypes); }
private async Task CompileAndLoad(Workspace[] workspaces) { var myWorksSpace = await FindOrCreate(workspaces); try { var result = await _sqlCqrsGenerator.Generate(0); if (result.Any()) { if (_dynamicPool.All(x => x.SourceUnits.SrcHash != result.SrcHash)) { _logger.Info("New metadata model loaded from database with {hash} hash.", result.SrcHash); DynamicAssembly assembly = new DynamicAssembly(_eventHub); assembly.AddDefaultReferences(); assembly.AppendSourceUnits(result); assembly.Compile(); _dynamicPool.AddOrReplace(assembly); _metadataProvider.Clear(); _metadataProvider.Discover(assembly.Assembly); // TODO: Refactor this and from Load await _eventHub.Publish(new AssemblyLoadedEvent() { Assembly = assembly.Assembly, Purpose = assembly.Purpose }); var c = await _repo.Query <Model.Compilation>() .FirstAsync(x => x.Hash == assembly.SrcHash); c.Workspace = myWorksSpace; myWorksSpace.Status = WorkspaceStatus.Running; c.LoadedAt = DateTimeOffset.Now; await _repo.CommitChanges(); } } } catch (Exception ex) { myWorksSpace.Status = WorkspaceStatus.Error; myWorksSpace.Error = ex.Message; await _repo.CommitChanges(); } }