public static Type GenerateServiceKernelType(Type kernelType, IServiceContract serviceContract) { var typeName = GenerateNameFromServiceContract(serviceContract); var interfaces = serviceContract.Interfaces .Select(model => model.Interface) .Append(typeof(IHostedService)) .ToArray(); var typeBuilder = _moduleBuilder.DefineType( typeName, TypeAttributes.Public | TypeAttributes.Sealed, typeof(object), interfaces); var serviceProviderField = typeBuilder.DefineField("_serviceProvider", typeof(IServiceProvider), FieldAttributes.Private); var serviceContractField = typeBuilder.DefineField("_serviceContract", typeof(IServiceContract), FieldAttributes.Private); var autobusField = typeBuilder.DefineField("_autobus", typeof(IAutobus), FieldAttributes.Private); GenerateConstructor(typeBuilder, serviceContract.GetType(), serviceProviderField, serviceContractField, autobusField); GenerateStartAsyncMethod(typeBuilder, serviceContractField, autobusField); GenerateStopAsyncMethod(typeBuilder, autobusField); foreach (var interfaceModel in serviceContract.Interfaces) { foreach (var requestModel in interfaceModel.Requests) { GenerateRequestMethod(typeBuilder, kernelType, serviceProviderField, requestModel); } foreach (var commandModel in interfaceModel.Commands) { GenerateCommandMethod(typeBuilder, kernelType, serviceProviderField, commandModel); } } return(typeBuilder.CreateType()); }