From 59a173bb8bd7b83e0e6e8a0636d7e71308ad1788 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 24 Oct 2022 18:39:22 +0800 Subject: [PATCH] Update `CSharpServiceProxyGenerator`. --- .../CSharp/CSharpServiceProxyGenerator.cs | 170 +++++++----------- 1 file changed, 68 insertions(+), 102 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs index 56dbadc793..9615a1f2b5 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs @@ -135,6 +135,7 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase x.Controllers).Where(x => ShouldGenerateProxy(x.Value))) { await GenerateClassFileAsync(args, controller.Value); @@ -148,11 +149,6 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase x.Key.StartsWith($"{GetTypeNamespace(controller.Value.Type)}")).Select(x => x.Key)); } - types = RemoveSystemAndDtoType(types); - - foreach (var type in applicationApiDescriptionModel.Types.Where(x => types.Contains(x.Key))) + for (var i = 0; i < types.Count; i++) { - GetRelatedTypes(types, applicationApiDescriptionModel, type.Value); + var className = types[i]; + if (className.StartsWith("Volo.Abp.Application.Dtos.") && className.Contains("<") && className.Contains(">")) + { + types[i] = className.Substring( + className.IndexOf("<", StringComparison.Ordinal) + 1, + className.IndexOf(">", StringComparison.Ordinal) - + className.IndexOf("<", StringComparison.Ordinal) -1); + } } - types = RemoveSystemAndDtoType(types); + types = types.Where(x => !x.StartsWith("System.") && !x.StartsWith("[System.")).Distinct().OrderBy(x => x).ToList(); foreach (var type in applicationApiDescriptionModel.Types.Where(x => types.Contains(x.Key))) { @@ -440,14 +434,26 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase types, ApplicationApiDescriptionModel applicationApiDescriptionModel, TypeApiDescriptionModel typeApiDescriptionModel) - { - if (!typeApiDescriptionModel.BaseType.IsNullOrEmpty() && - !typeApiDescriptionModel.BaseType.StartsWith("Volo.Abp.Application.Dtos") && - !typeApiDescriptionModel.BaseType.StartsWith("Volo.Abp.ObjectExtending")) - { - types.AddIfNotContains(typeApiDescriptionModel.BaseType); - } - - foreach (var property in typeApiDescriptionModel.Properties.Where(x => !types.Contains(x.Type))) - { - types.AddIfNotContains(property.Type); - - if (applicationApiDescriptionModel.Types.ContainsKey(property.Type)) - { - GetRelatedTypes(types, applicationApiDescriptionModel, applicationApiDescriptionModel.Types[property.Type]); - } - } - } - - private static List RemoveSystemAndDtoType(List types) - { - for (var i = 0; i < types.Count; i++) - { - var className = types[i]; - if (className.StartsWith("Volo.Abp.Application.Dtos.") && className.Contains("<") && className.Contains(">")) - { - types[i] = className.Substring( - className.IndexOf("<", StringComparison.Ordinal) + 1, - className.IndexOf(">", StringComparison.Ordinal) - - className.IndexOf("<", StringComparison.Ordinal) -1); - } - } - - return types.Where(x => !x.StartsWith("System.") && !x.StartsWith("[System.")).Distinct().OrderBy(x => x).ToList(); - } - private static bool IsAppServiceInterface(string typeName) { return typeName.StartsWith("I") && ServicePostfixes.Any(typeName.EndsWith); @@ -523,68 +494,54 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase usingNamespaceList = null) + private static string GetRealTypeName(string typeName, List usingNamespaceList = null) { if (typeName.StartsWith("[") && typeName.EndsWith("]")) { return GetRealTypeName(typeName.Substring(1, typeName.Length - 2), usingNamespaceList) + "[]"; } - var filter = new[] { "<", ",", ">" }; - var stringBuilder = new StringBuilder(); - var typeNames = typeName.Split('.'); - - if (typeNames.All(x => !filter.Any(x.Contains))) + if (typeName.StartsWith("{") && typeName.EndsWith("}") && typeName.Contains(":")) { - if (usingNamespaceList != null) - { - AddUsingNamespace(usingNamespaceList, typeName); - } - - return NormalizeTypeName(typeNames.Last()); + var dic = typeName.Substring(1, typeName.Length - 2).Split(":"); + var key = GetRealTypeName(dic[0], usingNamespaceList); + var value = GetRealTypeName(dic[1], usingNamespaceList); + return $"Dictionary<{key}, {value}>"; } - var fullName = string.Empty; + if (!typeName.Contains("<")) + { + usingNamespaceList?.AddIfNotContains($"using {GetTypeNamespace(typeName)};"); + return NormalizeTypeName(typeName.Split(".").Last()); + } - foreach (var item in typeNames) + var type = new StringBuilder(); + var s1 = typeName.Split("<"); + for (var i = 0; i < s1.Length; i++) { - if (filter.Any(x => item.Contains(x))) + if (s1[i].Contains(",")) { - if (usingNamespaceList != null) - { - AddUsingNamespace(usingNamespaceList, $"{fullName}.{item}".TrimStart('.')); - } - - fullName = string.Empty; - - if (item.Contains('<') || item.Contains(',')) - { - stringBuilder.Append(item.Substring(0, item.IndexOf(item.Contains('<') ? '<' : ',') + 1)); - fullName = item.Substring(item.IndexOf(item.Contains('<') ? '<' : ',') + 1); - } - else + var s2 = s1[i].Split(","); + for (var x = 0; x < s2.Length; x++) { - stringBuilder.Append(item); + type.Append(s2[x].Split(".").Last()); + if (x < s1.Length - 1) + { + type.Append(", "); + } } } else { - fullName = $"{fullName}.{item}"; + type.Append(s1[i].Split(".").Last()); + if (i < s1.Length - 1) + { + type.Append("<"); + } } } - return stringBuilder.ToString(); - } - - private static void AddUsingNamespace(List usingNamespaceList, string typeName) - { - var rootNamespace = $"using {GetTypeNamespace(typeName)};"; - if (usingNamespaceList.Contains(rootNamespace)) - { - return; - } - - usingNamespaceList.Add(rootNamespace); + return type.ToString(); } private static string NormalizeTypeName(string typeName) @@ -598,14 +555,23 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase "void", "Void" => "void", + "System.Boolean" => "bool", "Boolean" => "bool", + "System.String" => "string", "String" => "string", + "System.Int32" => "int", "Int32" => "int", + "System.Int64" => "long", "Int64" => "long", + "System.Double" => "double", "Double" => "double", + "System.Object" => "object", "Object" => "object", + "System.Byte" => "byte", "Byte" => "byte", + "System.Char" => "char", "Char" => "char", _ => typeName };