问题描述
在webapi项目中使用swagger作为接口文档是个很好的选择,但是有时候会遇到一些小问题。在单项目中大家都知道swagger会解析项目生成的xml注释文件,将注释添加到接口信息。但是如果分成多个项目会遇到注释只会在webapi项目中有解析,依赖的项目中的注释无法解析的情况。
问题原因
在配置swagger过程中,为了加入注释,需要引入项目生成的xml注释文档。但是一个项目的注释文档只会生成自身的注释文档。他依赖的项目注释并不会放入。于是乎swagger就认为你引用的Model没有注释。当然不会有描述了。
解决方案
其实很简单的思路。在项目启动文件里,执行文档合并的代码。将依赖的项目文档合并到主项目的文档中去。
具体实现
在各个需要生成注释文档的csproj文件里加入如下节点
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
合并文档代码
var directory = AppDomain.CurrentDomain.BaseDirectory;
// 找到所有的注释文档, 根据你的项目情况加上通配符。
var files = Directory.GetFiles(directory, "XXX.xml").ToList();
// 找到你的主项目注释文档
var mainFile = files.Where(u => u.Contains("XXXMain.xml")).FirstOrDefault();
if (string.IsNullOrEmpty(mainFile))
return;
files.Remove(mainFile);
if (files.Count == 0)
return;
var mainDoc = new XmlDocument();
mainDoc.Load(mainFile);
var membersNode = mainDoc.SelectSingleNode("//members");
files.ForEach(file => {
var doc = new XmlDocument();
doc.Load(file);
var nodes = doc.SelectNodes("//member");
foreach(XmlNode node in nodes)
{
var importNode = mainDoc.ImportNode(node, true);
membersNode.AppendChild(importNode);
}
});
files.ForEach(u =>
{
File.Delete(u);
});
mainDoc.Save(mainFile);
缺陷
会导致应用启动会慢一点。