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); }
public async Task WhenACommandhandlerIsGenerated(string handlerName) { var result = await this._applicationExecutor.ExecuteAsync <ISqlCqrsGenerator, SourceUnitCollection>(x => x.Generate(0)); DynamicAssembly assembly = new DynamicAssembly(NSubstitute.Substitute.For <IEventHub>()); assembly.AppendSourceUnits(result); assembly.AddDefaultReferences(); TypeCompiler compiler = new TypeCompiler(); _context["assembly"] = assembly.Compile(compiler); assembly.Assembly.GetTypes().Should().Contain(x => x.Name == handlerName); }
public async Task WhenIInvokeWithMethodAndArgument(string controllerTypeName, string methodName, string requestType, Table table) { var json = string.Join(Environment.NewLine, table.CreateSet <JsonScript>().Select(x => x.Json)); DynamicAssembly assembly = null; ServiceInfo[] services = this._applicationExecutor.Execute <IServiceMetadataProvider, IEnumerable <ServiceInfo> >(x => x.GetServices()).ToArray(); var result = await this._applicationExecutor.ExecuteAsync <IWebApiGenerator, SourceUnitCollection>(async x => x.Generate(services)); this._applicationExecutor.Execute <IDynamicTypePool>(pool => { if (pool.CanMerge) { assembly = pool.Merge(result); } else { assembly = new DynamicAssembly(NSubstitute.Substitute.For <IEventHub>()); pool.AddOrReplace(assembly); assembly.AppendSourceUnits(result); assembly.AddWebApiReferences(); assembly.AddReferenceFromTypes(_data.Types.Values); assembly.Compile(); } }); var controllerType = assembly.Load(assembly.SourceUnits.Single(x => x.FullName.Contains("Controller")).FullName); _applicationExecutor.Execute(controllerType, controller => { var createUserObj = JsonConvert.DeserializeObject(json, assembly.Load("Test.WebApi", requestType)); var parameters = new List <object>() { createUserObj }; if (_data.Id != Guid.Empty) { parameters.Insert(0, _data.Id); } Task task = (Task)controllerType.GetMethod(methodName).Invoke(controller, parameters.ToArray()); task.GetAwaiter().GetResult(); dynamic dTask = task; var response = dTask.Result; _data.ActualResult = response; }); }
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(); } }