private void GenerateServiceClient(ServiceDetail sd, string projectName) { var sb = new StringBuilder(); var svcName = sd.UserName; var channelName = (svcName.IndexOf("I", StringComparison.Ordinal) == 0 ? svcName.Remove(0, 1) : svcName) + "Client"; sb.Append(String.Join("; \r\n", _allUsings) + "; \r\n"); sb.Append(" namespace " + projectName + "\r\n { \r\n"); sb.Append("\t public partial class " + channelName + " : System.ServiceModel.ClientBase<" + svcName + "Client>, " + svcName + "Client, IProperter\r\n "); sb.Append("\t {"); sb.Append(GeneratePropertiesAndConstructors(svcName)); sb.Append(GenerateMethods(svcName + "Client")); sb.Append(GenerateAdditionMathods(svcName + "Client")); sb.Append(GenerateClientChannel(svcName + "Client")); sb.Append(" } \r\n"); sb.Append("}"); CreateDocument(sb.ToString(), projectName, "ServiceReferences/" + channelName + ".g.cs"); _competedArgsMethods = _competedArgsMethods == null ? _methods : _methods.Concat(_competedArgsMethods).ToList(); }
private void GenerateService(ServiceDetail service) { GetService(_generatorWorkspace.Solution, service); if (service.UserName != null) { GenerateInterfaceAndChannel(service, ProjectName); GenerateServiceClient(service, ProjectName); } }
private void GenerateApi(ServiceDetail service) { var svcName = service.UserName; var extIndex = svcName.IndexOf(".", StringComparison.Ordinal); svcName = extIndex > 0 ? svcName.Remove(extIndex) : svcName; svcName = svcName.IndexOf("I", StringComparison.Ordinal) == 0 ? svcName.Remove(0, 1) : svcName; var sb = new StringBuilder(); sb.Append(String.Join("; \r\n", _serviceUsings) + "; \r\n\r\n"); sb.Append(" namespace " + ProjectName + "\r\n { \r\n"); sb.Append("\t public partial class " + svcName + "Api\r\n\t { \r\n"); sb.Append("\t\t private ChannelContainer<T> CreateChannel<T>() where T : class, IProperter, new()\r\n\t\t { \r\n"); sb.Append("\t\t\t var clientContainer = ClientFactory<T>.CreateClient(_endPoint.ToString(), _binding, _endPoint); \r\n"); sb.Append("\t\t\t return clientContainer; \r\n\t\t } \r\n\r\n"); var api = _project.Documents.FirstOrDefault(x => x.Name == svcName + "Api.cs"); var declaredApiMethods = new List<MethodDeclarationSyntax>(); if (api != null) declaredApiMethods = GetMethodSyntaxesFromTree(api.GetSyntaxTreeAsync().Result); foreach (var method in _methods) { if (!declaredApiMethods.Any(x => x.Identifier.ToString() == method.Name && x.ParameterList.Parameters.ToString() == method.ParametersList.Parameters.ToString())) { var parameters = GenerateParameters(method.ParametersList); var paramList = method.ParametersList; var types = ""; var paramNames = ""; if (paramList != null) { types = paramList.Parameters.Aggregate(types, (current, param) => current + param.Type + ", "); types = types != "" ? "<" + types.Remove(types.Length - 2) + ">" : ""; paramNames = paramList.Parameters.Aggregate(paramNames, (current, param) => current + param.Identifier + ", "); } var returnType = method.ReturnTypeApi != "void" ? ("<" + method.ReturnTypeApi + ">") : ""; sb.Append("\t\t public async System.Threading.Tasks.Task" + returnType + " " + method.Name + "(" + parameters + ")\r\n"); sb.Append("\t\t {\r\n"); sb.Append("\t\t\t var channelContainer = CreateChannel<" + svcName + "Client> ();\r\n"); sb.Append("\t\t\t var scope = new FlowOperationContextScope(channelContainer.Client.InnerChannel);\r\n\r\n"); sb.Append("\t\t\t try\r\n"); sb.Append("\t\t\t {\r\n"); sb.Append("\t\t\t\t AddClientInformationHeader();\r\n"); sb.Append("\t\t\t\t"); if (method.ReturnTypeApi != "void") sb.Append(" return"); sb.Append(" await System.Threading.Tasks.Task" + (method.ReturnType != "void" ? ("<" + method.ReturnType + ">") : "") + ".Factory.FromAsync" + types + "(channelContainer.Client.Begin" + method.Name + ", channelContainer.Client.End" + method.Name + ", " + paramNames + " null).ContinueOnScope(scope);\r\n"); sb.Append("\t\t\t }\r\n"); sb.Append("\t\t\t finally\r\n"); sb.Append("\t\t\t {\r\n"); sb.Append("\t\t\t\t var disposable = channelContainer as IDisposable; \r\n"); sb.Append("\t\t\t\t if (disposable != null) disposable.Dispose();\r\n\r\n"); sb.Append("\t\t\t\t disposable = scope as IDisposable;\r\n"); sb.Append("\t\t\t\t if (disposable != null) disposable.Dispose();\r\n"); sb.Append("\t\t\t }\r\n"); sb.Append("\t\t }\r\n\r\n"); } } sb.Append("\t }"); sb.Append(" }"); CreateDocument(sb.ToString(), ProjectName, svcName + "Api.g.cs"); sb.Clear(); sb.Append(String.Join("; \r\n", _serviceUsings) + "; \r\n\r\n"); sb.Append(" namespace " + ProjectApi + "\r\n { \r\n"); sb.Append("\t public partial interface I" + svcName + "Api\r\n\t { \r\n"); var projectIApi = _generatorWorkspace.Solution.Projects.FirstOrDefault(x => x.Name == ProjectApi); if (projectIApi != null) { var iApi = projectIApi.Documents.FirstOrDefault(x => x.Name == "I" + svcName + "Api.cs"); if (iApi != null) declaredApiMethods = GetMethodSyntaxesFromTree(iApi.GetSyntaxTreeAsync().Result); } else { throw new Exception("Project for Interface Api doesn't exist"); } foreach (var method in _methods) { if (!declaredApiMethods.Any(x => x.Identifier.ToString() == method.Name && x.ParameterList.Parameters.ToString() == method.ParametersList.Parameters.ToString())) { var parameters = GenerateParameters(method.ParametersList); var returnType = method.ReturnTypeApi != "void" ? ("<" + method.ReturnTypeApi + ">") : ""; sb.Append("\t\t System.Threading.Tasks.Task" + returnType + " " + method.Name + "(" + parameters + ");\r\n"); } } sb.Append("\t }"); sb.Append(" }"); CreateDocument(sb.ToString(), ProjectApi, String.Join("/", ProjectApiFolders) + (ProjectApiFolders.Any() ? "/" : "") + "I" + svcName + "Api.g.cs"); }
private void GenerateInterfaceAndChannel(ServiceDetail iService, string projectName) { var sb = new StringBuilder(); var serviceFileName = iService.FileName.Remove(iService.FileName.IndexOf(".", StringComparison.Ordinal)); sb.Append(String.Join("; \r\n", _serviceUsings) + "; \r\n" + " \r\n\r\n"); sb.Append("namespace " + projectName + "\r\n { \r\n"); sb.Append("\t [System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.ServiceModel\", \"4.0.0.0\")]\r\n"); sb.Append("\t [System.ServiceModel.ServiceContractAttribute(ConfigurationName = \"" + serviceFileName + "Client\")]\r\n"); sb.Append("\t public interface " + iService.UserName + "Client\r\n \t{ \r\n"); sb.Append("\t\t bool IsCaughtException { get; set; } \r\n\r\n"); foreach (var method in _methods) { var parameters = method.ParametersList.ToString().Replace("(", "").Replace(")", ""); var pm = parameters != "" ? parameters + ", " : ""; sb.Append("\t\t [System.ServiceModel.OperationContractAttribute(AsyncPattern = true, Action = \"http://tempuri.org/" + serviceFileName + "/" + method.Name + "\", ReplyAction = \"http://tempuri.org/" + serviceFileName + "/" + method.Name + "Response\")]\r\n"); foreach (var fault in method.Faults) { var faultType = fault.Attributes.First().ArgumentList.Arguments.First().Expression.ToString().Replace("typeof(", "").Replace(")", ""); sb.Append("\t\t [System.ServiceModel.FaultContractAttribute(typeof(" + (FaultProject ?? ProjectApi) + "." + faultType + "), Action=\"http://tempuri.org/" + serviceFileName + "/" + method.Name + faultType + "Fault\", Name=\"" + faultType + "\", Namespace=\"http://schemas.datacontract.org/2004/07/YumaPos.Shared.API.Faults\")]\r\n"); } sb.Append("\t\t System.IAsyncResult Begin" + method.Name + "(" + pm + "System.AsyncCallback callback, object asyncState);\r\n\r\n"); sb.Append("\t\t " + method.ReturnType + " End" + method.Name + "(System.IAsyncResult result);\r\n\r\n"); } sb.Append("\t } \r\n\r\n"); sb.Append("\t [System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.ServiceModel\", \"4.0.0.0\")]\r\n"); sb.Append("\t public interface " + iService.UserName + "Channel : " + iService.UserName + "Client, System.ServiceModel.IClientChannel{} \r\n }"); CreateDocument(sb.ToString(), projectName, "ServiceReferences/" + iService.UserName + "Client.g.cs"); }
private Document GetService(Solution solution, ServiceDetail iService) { _methods = new List<EndPoint>(); Document svc = null; foreach (var project in solution.Projects) { foreach (var document in project.Documents) { if (document.Name == iService.FileName) { svc = document; break; } } } if (svc != null) { SyntaxNode documentRoot = svc.GetSyntaxRootAsync().Result; var rootCompUnit = (CompilationUnitSyntax) documentRoot; var defaultUsings = rootCompUnit.Usings.Select(x => x.Name.ToString()).ToList(); var methodDeclarationSyntaxs = GetMethodSyntaxesFromTree(svc.GetSyntaxTreeAsync().Result); _serviceUsings = GetUsings(svc, methodDeclarationSyntaxs, defaultUsings); _allUsings.AddRange(_serviceUsings.Except(_allUsings)); _methods.AddRange(methodDeclarationSyntaxs.Select(sm => new EndPoint() { Service = iService.UserName.IndexOf("I", StringComparison.Ordinal) == 0 ? iService.UserName.Remove(0, 1) : iService.UserName, Name = sm.Identifier.ToString(), ReturnType = GetFullReturnType(sm.ReturnType), ReturnTypeApi = GetFullReturnType(sm.ReturnType), InterfaceReturnType = GetFullReturnType(sm.ReturnType), ParametersList = sm.ParameterList, Faults = sm.AttributeLists.Where(x => x.Attributes.Any(a1 => a1.Name.ToString().Contains("FaultContract"))) })); foreach (var method in _methods) { method.ReturnType = ChangeType(method.ReturnType); method.ReturnTypeApi = ChangeType(method.ReturnTypeApi); } _methods = _methods.OrderBy(o => o.Name).ToList(); return svc; } Console.WriteLine("Service wasn't found"); return null; }