コード例 #1
0
        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();
        }
コード例 #2
0
        private void GenerateService(ServiceDetail service)
        {
            GetService(_generatorWorkspace.Solution, service);

            if (service.UserName != null)
            {
                GenerateInterfaceAndChannel(service, ProjectName);
                GenerateServiceClient(service, ProjectName);
            }
        }
コード例 #3
0
        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");
        }
コード例 #4
0
        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");
        }
コード例 #5
0
        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;
        }