/// <summary> /// Create all internal structures. /// </summary> public override void Create(ProxySerializationContext context) { ProcessSerializationAttribute(); ProcessWebAttribute(); ProcessInputArguments(); ProcessSerializers(context); }
/// <summary> /// Build all proxies /// </summary> public void Build() { // Collect all types that are ServiceContract interfaces var serviceContractIntfTypes = assemblies.SelectMany(x => x.MainModule.GetTypes()).Where(x => x.IsInterface && x.HasServiceContractAttribute()); var proxyBuilders = serviceContractIntfTypes.Select(x => new ProxyClassBuilder(x)).ToList(); // Build structures var context = new ProxySerializationContext(); proxyBuilders.ForEach(x => x.Create(context)); context.Create(context); // Generate code var code = new StringBuilder(128 * 1024); using (var codeWriter = new StringWriter(code)) { var codeGenerator = new CodeGenerator(); proxyBuilders.ForEach(x => x.Generate(codeGenerator)); context.Generate(codeGenerator); codeGenerator.Generate(codeWriter); } // Load existing C# code var existingCode = File.Exists(generatedSourcePath) ? File.ReadAllText(generatedSourcePath) : string.Empty; var generatedCode = code.ToString(); if (existingCode != generatedCode) { // Ensure directory exists Directory.CreateDirectory(Path.GetDirectoryName(generatedSourcePath)); // Write C# File.WriteAllText(generatedSourcePath, generatedCode); } }
/// <summary> /// Create all internal structures. /// </summary> public void Create(ProxySerializationContext context) { foreach (var property in type.Properties) { if (!Ignore(property)) { var builder = context.GetDeserializer(property.PropertyType.Resolve()); var builderHelper = new DeserializerBuilderHelper { TypeDeserializerBuilder = builder, PropertyName = property.Name }; FillBuilderHelper(type, property, builderHelper); builders.Add(property.Name, builderHelper); } } }
/// <summary> /// Create all internal structures /// </summary> public void Create(ProxySerializationContext context) { var start = 0; var serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray(); while (serializeBuilders.Any()) { serializeBuilders.ForEach(x => x.Create(context)); start = start + serializeBuilders.Length; serializeBuilders = typeSerializerBuilders.Values.Skip(start).ToArray(); } start = 0; var deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray(); while (deserializeBuilders.Any()) { deserializeBuilders.ForEach(x => x.Create(context)); start = start + deserializeBuilders.Length; deserializeBuilders = typeDeserializerBuilders.Values.Skip(start).ToArray(); } }
private void ProcessSerializers(ProxySerializationContext context) { if (InterfaceMethod.ReturnType != null) { var typeDefinition = InterfaceMethod.ReturnType.Resolve(); if (typeDefinition.FullName != "System.Void") { typeDeserializerBuilder = context.GetDeserializer(typeDefinition); deserializerTypeIsArray = InterfaceMethod.ReturnType.IsArray; } } if (!string.IsNullOrEmpty(toSerializeArgument)) { var parameter = InterfaceMethod.Parameters.First(p => p.Name == toSerializeArgument); var typeDefinition = parameter.ParameterType.Resolve(); typeSerializerBuilder = context.GetSerializer(typeDefinition); serializerTypeIsArray = parameter.ParameterType.IsArray; } }
/// <summary> /// Create all internal structures. /// </summary> public void Create(ProxySerializationContext context) { ProcessSerializationAttribute(); // Create type name of proxy class proxyTypeName = interfaceType.Name + "__WcfProxy"; // Collect all methods for which we have to build a proxy var operationMethods = new List<MethodDefinition>(); var otherMethods = new List<MethodDefinition>(); var processed = new HashSet<TypeDefinition>(); CollectOperationMethods(operationMethods, otherMethods, interfaceType, processed); // Prepare method proxy builders methodBuilders = new List<ProxyMethodBuilder>(); methodBuilders.AddRange(operationMethods.Select(x => new ProxyOperationContractMethodBuilder(this, x))); methodBuilders.AddRange(otherMethods.Select(x => new ProxyNotSupportedMethodBuilder(this, x))); // Prepare internal structures of method builders methodBuilders.ForEach(x => x.Create(context)); }
/// <summary> /// Create all internal structures. /// </summary> public void Create(ProxySerializationContext context) { ProcessSerializationAttribute(); // Create type name of proxy class proxyTypeName = interfaceType.Name + "__WcfProxy"; // Collect all methods for which we have to build a proxy var operationMethods = new List <MethodDefinition>(); var otherMethods = new List <MethodDefinition>(); var processed = new HashSet <TypeDefinition>(); CollectOperationMethods(operationMethods, otherMethods, interfaceType, processed); // Prepare method proxy builders methodBuilders = new List <ProxyMethodBuilder>(); methodBuilders.AddRange(operationMethods.Select(x => new ProxyOperationContractMethodBuilder(this, x))); methodBuilders.AddRange(otherMethods.Select(x => new ProxyNotSupportedMethodBuilder(this, x))); // Prepare internal structures of method builders methodBuilders.ForEach(x => x.Create(context)); }
/// <summary> /// Create all internal structures. /// </summary> public abstract void Create(ProxySerializationContext context);
/// <summary> /// Create all internal structures. /// </summary> public override void Create(ProxySerializationContext context) { // Do nothing }