public bool CompileAssets(IFunctionCompilerMetadata functionCompilerMetadata, string newAssemblyNamespace, IFunctionAppConfiguration configuration, IReadOnlyCollection <string> externalAssemblies, string outputBinaryFolder) { HandlebarsHelpers.AzureFunctions.HandlebarsHelperRegistration.RegisterHelpers(); bool isFSharpProject = functionCompilerMetadata.FunctionDefinitions.Any(x => x.IsFunctionalFunction); if (isFSharpProject) { _compilerLog.Warning("FSharp output is currently experimental"); } OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, outputBinaryFolder); _assemblyCompiler.OpenApiOutputModel = openApi; _jsonCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, openApi, outputBinaryFolder, newAssemblyNamespace); return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, outputBinaryFolder, $"{newAssemblyNamespace}.dll", functionCompilerMetadata.CompilerOptions, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
private static bool TryFindCompilerMetadata(out MethodInfo linkBackInfo, out IFunctionCompilerMetadata findConfiguration) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); linkBackInfo = null; findConfiguration = null; foreach (Assembly assembly in assemblies) { IFunctionCompilerMetadata configuration = FindCompilerMetadata(assembly); if (configuration != null) { { findConfiguration = configuration; return(true); } } string assemblyName = assembly.GetName().Name; if (assemblyName.EndsWith(".Functions.dll")) { Type[] candidateReferenceLinkBackTypes = assembly.GetTypes() .Where(x => x.Name == "ReferenceLinkBack" && x.IsAbstract && x.IsSealed).ToArray(); if (candidateReferenceLinkBackTypes.Length == 1) { if (candidateReferenceLinkBackTypes[0].GetCustomAttributes <ReferenceLinkBackAttribute>().Any()) { linkBackInfo = candidateReferenceLinkBackTypes[0].GetMethod("ForceLinkBack"); } } } } return(false); }
public static IFunctionCompilerMetadata FindCompilerMetadata(Assembly assembly) { if (assembly == null) { return(FindCompilerMetadata()); } try { foreach (Type type in assembly.GetTypes()) { foreach (PropertyInfo propertyInfo in type.GetProperties(BindingFlags.Public | BindingFlags.Static)) { if (propertyInfo.PropertyType == typeof(IFunctionCompilerMetadata)) { IFunctionCompilerMetadata metadata = (IFunctionCompilerMetadata)propertyInfo.GetValue(null); return(metadata); } } } return(null); } catch (ReflectionTypeLoadException rex) { throw RaiseTypeLoadingException(rex); } }
public bool Compile() { string newAssemblyNamespace = $"{_configurationSourceAssembly.GetName().Name.Replace("-", "_")}.Functions"; IFunctionCompilerMetadata functionCompilerMetadata = null; IFunctionAppConfiguration configuration = ConfigurationLocator.FindConfiguration(_configurationSourceAssembly); if (configuration == null) { functionCompilerMetadata = ConfigurationLocator.FindCompilerMetadata(_configurationSourceAssembly); if (functionCompilerMetadata == null) { _compilerLog.Error($"The assembly {_configurationSourceAssembly.GetName().Name} does not contain a public class implementing the IFunctionAppConfiguration interface"); return(false); } } else { FunctionHostBuilder builder = new FunctionHostBuilder(_serviceCollection, _commandRegistry, false); configuration.Build(builder); new PostBuildPatcher().Patch(builder, newAssemblyNamespace); if (!VerifyCommandAndResponseTypes(builder)) { return(false); } functionCompilerMetadata = new FunctionCompilerMetadata { FunctionDefinitions = builder.FunctionDefinitions, OpenApiConfiguration = builder.OpenApiConfiguration, OutputAuthoredSourceFolder = builder.OutputAuthoredSourceFolder }; } IReadOnlyCollection <string> externalAssemblies = GetExternalAssemblyLocations(functionCompilerMetadata.FunctionDefinitions); OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, _outputBinaryFolder); _jsonCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, openApi, _outputBinaryFolder, newAssemblyNamespace); return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, _outputBinaryFolder, $"{newAssemblyNamespace}.dll", openApi, _compileTarget, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
public bool CompileAssets(IFunctionCompilerMetadata functionCompilerMetadata, string newAssemblyNamespace, IFunctionAppConfiguration configuration, IReadOnlyCollection <string> externalAssemblies, string outputBinaryFolder) { _compilerLog.Warning("ASP.Net Core output is currently experimental"); FunctionMonkey.Compiler.Core.HandlebarsHelpers.AspNetCore.HandlebarsHelperRegistration.RegisterHelpers(); OpenApiOutputModel openApi = _openApiCompiler.Compile(functionCompilerMetadata.OpenApiConfiguration, functionCompilerMetadata.FunctionDefinitions, outputBinaryFolder); _assemblyCompiler.OpenApiOutputModel = openApi; return(_assemblyCompiler.Compile(functionCompilerMetadata.FunctionDefinitions, configuration?.GetType() ?? functionCompilerMetadata.BacklinkReferenceType, configuration != null ? null : functionCompilerMetadata.BacklinkPropertyInfo, newAssemblyNamespace, externalAssemblies, outputBinaryFolder, $"{newAssemblyNamespace}.dll", functionCompilerMetadata.CompilerOptions, functionCompilerMetadata.OutputAuthoredSourceFolder)); }
public bool Compile() { string newAssemblyNamespace = $"{_configurationSourceAssembly.GetName().Name.Replace("-", "_")}.Functions"; IFunctionCompilerMetadata functionCompilerMetadata = null; IFunctionAppConfiguration configuration = null; FunctionAppHostBuilder appHostBuilder = null; IFunctionAppHost appHost = ConfigurationLocator.FindFunctionAppHost(_configurationSourceAssembly); if (appHost != null) { appHostBuilder = new FunctionAppHostBuilder(); appHost.Build(appHostBuilder); if (appHostBuilder.FunctionAppConfiguration != null) { configuration = (IFunctionAppConfiguration)Activator.CreateInstance(appHostBuilder.FunctionAppConfiguration); } } if (configuration == null) { configuration = ConfigurationLocator.FindConfiguration(_configurationSourceAssembly); } if (configuration == null) { functionCompilerMetadata = ConfigurationLocator.FindCompilerMetadata(_configurationSourceAssembly); if (functionCompilerMetadata == null) { _compilerLog.Error($"The assembly {_configurationSourceAssembly.GetName().Name} does not contain a public class implementing the IFunctionAppConfiguration interface"); return(false); } } else { FunctionHostBuilder builder = new FunctionHostBuilder(_serviceCollection, _commandRegistry, false); if (appHostBuilder != null) { builder.Options = appHostBuilder.Options; } configuration.Build(builder); DefaultMediatorSettings.SetDefaultsIfRequired(builder); if (!ValidateCommandTypes(builder)) { return(false); } IMediatorResultTypeExtractor extractor = CreateMediatorResultTypeExtractor(builder.Options.MediatorResultTypeExtractor); if (extractor == null) { return(false); } new PostBuildPatcher(extractor).Patch(builder, newAssemblyNamespace); if (!VerifyCommandAndResponseTypes(builder)) { return(false); } if (!VerifyOutputBindings(builder)) { return(false); } functionCompilerMetadata = new FunctionCompilerMetadata { FunctionDefinitions = builder.FunctionDefinitions, OpenApiConfiguration = builder.OpenApiConfiguration, OutputAuthoredSourceFolder = builder.Options.OutputSourceTo, CompilerOptions = builder.Options }; } PostBuildPatcher.EnsureFunctionsHaveUniqueNames(functionCompilerMetadata.FunctionDefinitions); IReadOnlyCollection <string> externalAssemblies = GetExternalAssemblyLocations(functionCompilerMetadata.FunctionDefinitions); ITargetCompiler targetCompiler = functionCompilerMetadata.CompilerOptions.HttpTarget == CompileTargetEnum.AzureFunctions ? (ITargetCompiler) new AzureFunctionsCompiler(_compilerLog) : new AspNetCoreCompiler(_compilerLog); return(targetCompiler.CompileAssets(functionCompilerMetadata, newAssemblyNamespace, configuration, externalAssemblies, _outputBinaryFolder)); }
public RuntimeInstance(Assembly functionAppConfigurationAssembly, Action <IServiceCollection, ICommandRegistry> beforeServiceProviderBuild, IServiceCollection serviceCollection) { if (serviceCollection == null) { System.Console.WriteLine("No service collection supplied by runtime"); } ServiceCollection = serviceCollection ?? new ServiceCollection(); BuiltServiceProvider = new Lazy <IServiceProvider>(() => ServiceCollection.BuildServiceProvider()); FunctionAppHostBuilder appHostBuilder = null; IFunctionAppConfiguration configuration = null; IFunctionAppHost appHost = ConfigurationLocator.FindFunctionAppHost(functionAppConfigurationAssembly); if (appHost != null) { appHostBuilder = new FunctionAppHostBuilder(); appHost.Build(appHostBuilder); if (appHostBuilder.FunctionAppConfiguration != null) { configuration = (IFunctionAppConfiguration)Activator.CreateInstance(appHostBuilder.FunctionAppConfiguration); } } if (configuration == null) { configuration = ConfigurationLocator.FindConfiguration(functionAppConfigurationAssembly); } CommandingDependencyResolverAdapter adapter = new CommandingDependencyResolverAdapter( (fromType, toInstance) => ServiceCollection.AddSingleton(fromType, toInstance), (fromType, toType) => ServiceCollection.AddTransient(fromType, toType), resolveType => ServiceProvider.GetService(resolveType) ); ICommandRegistry commandRegistry; // ReSharper disable once SuspiciousTypeConversion.Global - externally provided if (configuration != null && configuration is ICommandingConfigurator commandingConfigurator) { commandRegistry = commandingConfigurator.AddCommanding(adapter); } else { CommandingRuntime commandingRuntime = new CommandingRuntime(); commandRegistry = commandingRuntime.AddCommanding(adapter); } // Register internal implementations RegisterInternalImplementations(); FunctionHostBuilder builder = null; IFunctionCompilerMetadata functionCompilerMetadata = null; CompileTargetEnum compileTarget; if (configuration != null) { // Invoke the builder process builder = CreateBuilderFromConfiguration(commandRegistry, configuration); if (appHostBuilder != null) { builder.Options = appHostBuilder.Options; } FunctionBuilder functionBuilder = (FunctionBuilder)builder.FunctionBuilder; FunctionDefinitions = builder.FunctionDefinitions; compileTarget = builder.Options.HttpTarget; SetupAuthorization(builder, functionBuilder); } else { functionCompilerMetadata = LocateFunctionCompilerMetadata(functionAppConfigurationAssembly); FunctionDefinitions = functionCompilerMetadata.FunctionDefinitions; compileTarget = functionCompilerMetadata.CompilerOptions.HttpTarget; } PostBuildPatcher.EnsureFunctionsHaveUniqueNames(FunctionDefinitions); RegisterCoreDependencies(builder?.MediatorType ?? typeof(DefaultMediatorDecorator), FunctionDefinitions, compileTarget); RegisterTimerCommandFactories(FunctionDefinitions); RegisterHttpDependencies(FunctionDefinitions); RegisterCosmosDependencies(FunctionDefinitions); RegisterOutputBindingDependencies(FunctionDefinitions); CreatePluginFunctions(functionCompilerMetadata?.ClaimsMappings, FunctionDefinitions); RegisterLoggerIfRequired(); }
private IFunctionCompilerMetadata LocateFunctionCompilerMetadata(Assembly functionAppConfigurationAssembly) { IFunctionCompilerMetadata metadata = ConfigurationLocator.FindCompilerMetadata(functionAppConfigurationAssembly); return(metadata); }
public RuntimeInstance(Assembly functionAppConfigurationAssembly, Action <IServiceCollection, ICommandRegistry> beforeServiceProviderBuild, IServiceCollection serviceCollection) { ServiceCollection = serviceCollection ?? new ServiceCollection(); BuiltServiceProvider = new Lazy <IServiceProvider>(() => ServiceCollection.BuildServiceProvider()); // Find the configuration implementation and service collection IFunctionAppConfiguration configuration = LocateConfiguration(functionAppConfigurationAssembly); CommandingDependencyResolverAdapter adapter = new CommandingDependencyResolverAdapter( (fromType, toInstance) => ServiceCollection.AddSingleton(fromType, toInstance), (fromType, toType) => ServiceCollection.AddTransient(fromType, toType), resolveType => ServiceProvider.GetService(resolveType) ); ICommandRegistry commandRegistry; // ReSharper disable once SuspiciousTypeConversion.Global - externally provided if (configuration != null && configuration is ICommandingConfigurator commandingConfigurator) { commandRegistry = commandingConfigurator.AddCommanding(adapter); } else { CommandingRuntime commandingRuntime = new CommandingRuntime(); commandRegistry = commandingRuntime.AddCommanding(adapter); } // Register internal implementations RegisterInternalImplementations(); FunctionHostBuilder builder = null; IFunctionCompilerMetadata functionCompilerMetadata = null; if (configuration != null) { // Invoke the builder process builder = CreateBuilderFromConfiguration(commandRegistry, configuration); FunctionBuilder functionBuilder = (FunctionBuilder)builder.FunctionBuilder; FunctionDefinitions = builder.FunctionDefinitions; SetupAuthorization(builder, functionBuilder); } else { functionCompilerMetadata = LocateFunctionCompilerMetadata(functionAppConfigurationAssembly); FunctionDefinitions = functionCompilerMetadata.FunctionDefinitions; } RegisterCoreDependencies(FunctionDefinitions); RegisterTimerCommandFactories(FunctionDefinitions); RegisterHttpDependencies(FunctionDefinitions); RegisterCosmosDependencies(FunctionDefinitions); CreatePluginFunctions(functionCompilerMetadata?.ClaimsMappings, FunctionDefinitions); //beforeServiceProviderBuild?.Invoke(ServiceCollection, commandRegistry); //ServiceProvider = containerProvider.CreateServiceProvider(ServiceCollection); //afterServiceProviderBuild?.Invoke(ServiceProvider, commandRegistry); //builder?.ServiceProviderCreatedAction?.Invoke(ServiceProvider); }