我在ASP.NET Core 3.1 API中有2个区域,每个区域都有模型。我正在尝试生成2个草率的文档,每个文档都针对其区域。根据IOperationProcessor筛选操作,并且所有操作均正确。但是,每个文档都包含来自两个区域的所有文档。
如何控制哪个文档中包含哪些模型?
这是我目前所拥有的:
services.AddOpenApiDocument(swagger =>
{
swagger.DocumentName = "admin";
swagger.OperationProcessors.Add(new Swagger.AdminOperationProcessor());
swagger.SchemaNameGenerator = new Swagger.SchemaNameGenerator();
});
services.AddOpenApiDocument(openApi =>
{
openApi.DocumentName = "public";
openApi.OperationProcessors.Add(new Swagger.PublicOperationProcessor());
openApi.SchemaNameGenerator = new Swagger.SchemaNameGenerator();
openApi.PostProcess = (x) =>
{
};
});
寻找年龄之后,我所要做的只是有些拙劣的解决方案。使用ISchemaNameGenerator将不需要的名称替换为其他名称(我将“。”替换为“ _”)。然后使用PostProcess将其从生成的架构中删除。由于某些原因,ExcludedTypeNames无法正常工作。
var excludedList = new List<string>();
// this is called first
settings.SchemaNameGenerator = new SchemaNameGenerator(x =>
{
if (!typeNamespaces.Any(n => x.FullName.StartsWith(n)))
{
excludedList.Add(x.FullName);
}
return !typeNamespaces.Any(n => x.FullName.StartsWith(n));
});
// Post process relies on excluded list, otherwise it won't work
settings.PostProcess = (doc) =>
{
foreach (var exItem in excludedList)
{
var formatted = exItem.Replace(".", "_");
if (doc.Definitions.ContainsKey(formatted))
{
doc.Definitions.Remove(formatted);
}
}
};
SchemaNameGenerator为:
public class SchemaNameGenerator : ISchemaNameGenerator
{
private Func<Type, bool> excludePredicate;
public SchemaNameGenerator(Func<Type, bool> excludePredicate = null)
{
this.excludePredicate = excludePredicate;
}
public string Generate(Type type)
{
var displayAttr = type
.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.Cast<DisplayNameAttribute>()
.FirstOrDefault();
if (excludePredicate != null)
{
if (excludePredicate(type))
{
return type.FullName.Replace(".", "_");
}
}
return displayAttr?.DisplayName ?? type.Name;
}
}
[如果有人有更好的主意,请告诉我。