Beispiel #1
0
        // ────────────────────────── Constructor ──────────────────────────
        public Contracts(IEnumerable<Assembly> assemblies, XmlComments xmlComments, ServiceType serviceType)
        {
            var types = new List<ContractType>();
            var services = new List<ContractService>();

            LoadMetadata(assemblies, types, services);
            LoadTypes(assemblies, types, services);
            LoadServices(assemblies, services);

            LoadXmlComments(xmlComments, types, services);

            Types = types;

            switch (serviceType)
            {
                case ServiceType.All: Services = services; break;
                case ServiceType.Soap: Services = services.Where(x => !x.Restful).ToList(); break;
                case ServiceType.Rest: Services = services.Where(x => x.Restful).ToList(); break;
            }
        }
Beispiel #2
0
        private static XElement GetServices(Context context, Contracts contracts)
        {
            var servicesElement = new XElement("services");

            XmlComments xmlComments = null;
            if (context.XmlComments != null)
                xmlComments = new XmlComments(context.XmlComments);

            var types = context.Assemblies.FindTypes(
                t => (t.IsClass && (from contract in contracts.Services select contract.Type).Contains(t)) ||
                     t.ImplementsInterface(from contract in contracts.Services select contract.Type));

            foreach (var type in types)
            {
                var serviceElement = new XElement("service",
                    new XAttribute("id", type.AssemblyQualifiedName.Hash()),
                    new XAttribute("type", type.FullName),
                    new XAttribute("assembly", type.Assembly.FullName));

                if (xmlComments != null)
                    serviceElement.Add(
                        new XElement("comments",
                            xmlComments.GetTypeComments(type)));

                if (context.ServiceWebsite != null)
                    serviceElement.Add(new XElement("website",
                        from file in context.ServiceWebsite
                        where file.Type.Equals(type.FullName, StringComparison.OrdinalIgnoreCase)
                        select new XElement("path",
                                new XText(file.Uri.ToString()))));

                if (context.Config != null)
                    serviceElement.Add(new XElement("endpoints",
                        new Configuration(context.Config).GetEndpoints(type.FullName)));

                serviceElement.Add(new XElement("contracts",
                    from contract in contracts.Services
                    where type.ImplementsInterface(contract.Type) || type == contract.Type
                    select new XElement("contract", new XText(contract.Type.FullName))));

                servicesElement.Add(serviceElement);
            }
            return servicesElement;
        }
Beispiel #3
0
        private static void LoadXmlComments(
            XmlComments xmlComments,
            IEnumerable<ContractType> types,
            IEnumerable<ContractService> services)
        {
            if (xmlComments == null) return;

            var memberMapping =
                new Dictionary<string, XmlComments.XmlMemberInfo>();

            Action<string, XmlComments.XmlMemberInfo> addMemberMapping =
                (k, v) => {
                    if (!memberMapping.ContainsKey(k))
                        memberMapping.Add(k, v);
                    else throw new Exception(string.Format("Duplicate xml comment member found: {0}.{1}", v.Assembly, v.Name));
                };

            foreach (var type in types)
            {
                type.Comments = xmlComments.GetTypeComments(type.Type);
                if (type.Type != null)
                    addMemberMapping(type.Metadata.Id, XmlComments.GetMemberInfo(type.Type));

                foreach (var member in type.Members)
                {
                    member.Comments =
                        xmlComments.GetFieldOrPropertyComments(member.MemberInfo);
                    addMemberMapping(member.Metadata.Id, XmlComments.GetMemberInfo(member.MemberInfo));
                }

                foreach (var option in type.Options)
                    option.Comments = xmlComments.GetFieldComments(option.FieldInfo);
            }

            foreach (var service in services)
            {
                service.Comments = xmlComments.GetTypeComments(service.Type);
                addMemberMapping(service.Metadata.TypeId, XmlComments.GetMemberInfo(service.Type));

                foreach (var operation in service.Operations)
                {
                    operation.Comments = xmlComments.GetMethodComments(operation.MethodInfo);
                    addMemberMapping(operation.Metadata.Id, XmlComments.GetMemberInfo(operation.MethodInfo));

                    foreach (var parameter in operation.Parameters.Where(parameter => parameter.ParameterInfo != null))
                    {
                        parameter.Comments =
                            xmlComments.GetMethodParameterComments(operation.MethodInfo, parameter.ParameterInfo.Name);
                    }

                    operation.ReturnType.Comments = xmlComments.GetMethodReturnTypeComments(operation.MethodInfo);
                }
            }
            xmlComments.ReplaceMemberReferences(memberMapping);
        }