コード例 #1
0
        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());
        }