// ────────────────────────── 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; } }
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; }
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); }