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);
        }
예제 #2
0
        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();
            }
        }