private void GenerateProxyType(ComponentDefinition componentDefinition) { var proxyTypeBuilder = _moduleBuilder.DefineType(componentDefinition.Name, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed, componentDefinition.BaseType); var dependenciesDictionary = GenerateDependencyFields(proxyTypeBuilder, componentDefinition.Dependencies); foreach (var signal in componentDefinition.Signals) { if (signal.Connections.Count() <= 0) { if (signal.SignalMethod.IsAbstract) { throw new InvalidOperationException($"{componentDefinition.Name}.{signal.SignalMethod.Name} is mandatory. Please define a connection."); } } else { if (signal.Connections.Count() > 1 && signal.SignalMethod.ReturnType != typeof(void)) { throw new InvalidOperationException($"{componentDefinition.Name}.{signal.SignalMethod.Name} cannot be used with multiple connections because it expects a single return value."); } var signalMethodOverride = PrepareMethodOverride(proxyTypeBuilder, signal.SignalMethod); GenerateIL(signalMethodOverride, signal, dependenciesDictionary); proxyTypeBuilder.DefineMethodOverride(signalMethodOverride, signal.SignalMethod); } } componentDefinition.ProxyType = proxyTypeBuilder.CreateTypeInfo(); }
private void GenerateProxyTypesRecursive(ComponentDefinition componentDefinition, int recursionDepth) { if (recursionDepth > _componentDefinitions.Count) { throw new ComponentDefinitionLoopException($"The recursion depth is greater than the number of components. Is there a loop in the endpoint configuration?"); } if (componentDefinition.ProxyType != null) { return; } foreach (var dependency in componentDefinition.Dependencies) { var dependencyComponentDefinition = _componentDefinitions[dependency.Name]; GenerateProxyTypesRecursive(dependencyComponentDefinition, recursionDepth + 1); dependency.ComponentDefinition = dependencyComponentDefinition; } GenerateProxyType(componentDefinition); }