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 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; }); }