public ActorProxyGeneratorBuildResult Build( Type proxyInterfaceType, IEnumerable <InterfaceDescription> interfaceDescriptions) { // create the context to build the proxy var context = new CodeBuilderContext( assemblyName: this.CodeBuilder.Names.GetProxyAssemblyName(proxyInterfaceType), assemblyNamespace: this.CodeBuilder.Names.GetProxyAssemblyNamespace(proxyInterfaceType), enableDebugging: CodeBuilderAttribute.IsDebuggingEnabled(proxyInterfaceType)); var result = new ActorProxyGeneratorBuildResult(context); // ensure that method data types are built for each of the remote interfaces var methodBodyTypesResultsMap = interfaceDescriptions.ToDictionary( d => d, d => this.CodeBuilder.GetOrBuildMethodBodyTypes(d.InterfaceType)); // build the proxy class that implements all of the interfaces explicitly result.ProxyType = this.BuildProxyType(context, proxyInterfaceType, methodBodyTypesResultsMap); // build the activator type to create instances of the proxy result.ProxyActivatorType = this.BuildProxyActivatorType(context, proxyInterfaceType, result.ProxyType); // build the proxy generator result.ProxyGenerator = this.CreateProxyGenerator( proxyInterfaceType, result.ProxyActivatorType); context.Complete(); return(result); }
public MethodBodyTypesBuildResult Build(InterfaceDescription interfaceDescription) { var context = new CodeBuilderContext( assemblyName: this.CodeBuilder.Names.GetMethodBodyTypesAssemblyName(interfaceDescription.InterfaceType), assemblyNamespace: this.CodeBuilder.Names.GetMethodBodyTypesAssemblyNamespace(interfaceDescription.InterfaceType), enableDebugging: CodeBuilderAttribute.IsDebuggingEnabled(interfaceDescription.InterfaceType)); var result = new MethodBodyTypesBuildResult(context) { MethodBodyTypesMap = new Dictionary <string, MethodBodyTypes>(), }; foreach (var method in interfaceDescription.Methods) { result.MethodBodyTypesMap.Add( method.Name, Build(this.CodeBuilder.Names, context, method)); } context.Complete(); return(result); }
public MethodDispatcherBuildResult Build( InterfaceDescription interfaceDescription) { var context = new CodeBuilderContext( assemblyName: this.CodeBuilder.Names.GetMethodDispatcherAssemblyName(interfaceDescription.InterfaceType), assemblyNamespace: this.CodeBuilder.Names.GetMethodDispatcherAssemblyNamespace(interfaceDescription .InterfaceType), enableDebugging: CodeBuilderAttribute.IsDebuggingEnabled(interfaceDescription.InterfaceType)); var result = new MethodDispatcherBuildResult(context); // ensure that the method body types are built var methodBodyTypesBuildResult = this.CodeBuilder.GetOrBuildMethodBodyTypes(interfaceDescription.InterfaceType); // build dispatcher class var classBuilder = CodeBuilderUtils.CreateClassBuilder( context.ModuleBuilder, ns: context.AssemblyNamespace, className: this.CodeBuilder.Names.GetMethodDispatcherClassName(interfaceDescription.InterfaceType), baseType: this.methodDispatcherBaseType); this.AddCreateResponseBodyMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); this.AddOnDispatchAsyncMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); this.AddOnDispatchMethod(classBuilder, interfaceDescription, methodBodyTypesBuildResult); var methodNameMap = GetMethodNameMap(interfaceDescription); // create the dispatcher type, instantiate and initialize it result.MethodDispatcherType = classBuilder.CreateTypeInfo().AsType(); result.MethodDispatcher = (TMethodDispatcher)Activator.CreateInstance(result.MethodDispatcherType); var v2MethodDispatcherBase = (ActorMethodDispatcherBase)result.MethodDispatcher; v2MethodDispatcherBase.Initialize(interfaceDescription, methodNameMap); context.Complete(); return(result); }