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