我想开发一个新的API。它必须将Dynamics CRM和前端开发人员联系起来。
今天,开发的“解决方法是:
第一步,我想生成没有字符串连接的架构...(暂时,等待用OData和ASP.NET Core替换Excel文件以具有更强大的功能)
目前,我使用反射从Excel文件构建对象:
using System.Reflection;
using System.Reflection.Emit;
using Swashbuckle.Swagger;
...
var assemblyName = new AssemblyName(Guid.NewGuid().ToString();
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("Module");
var typeBuilder = moduleBuilder.DefineType(entity.CrmEntityName);
foreach (var attribute in entity.Attributes)
{
Type t = typeof(int);
switch (attribute.DataType.ToLower())
{
case "string":
t = typeof(string);
break;
case "integer":
t = typeof(int);
break;
case "date":
t = typeof(DateTime);
break;
}
typeBuilder.DefineField(attribute.CrmName, t.GetType(), FieldAttributes.Public);
var type = typeBuilder.CreateType();
// create the Swagger models here
}
如何从这些类型和属性生成我的招摇?我查看了一个名为Schema
的对象,该对象包含一个名称和另一个Schema
,我不知道这是否是错误的方法...
您可以实现并注册一个IDocumentFilter,可以在其中注册使用TypeBuilder创建的自定义类型。
public class MyDocFilter : Swashbuckle.Swagger.IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
schemaRegistry.GetOrRegister(MyDynamicType);
}
}
确保像这样在SwaggerConfig中注册它:
c.DocumentFilter<MyDocFilter>();
然后,自定义类型应出现在Swagger文档的“定义”部分中。现在,如果您有一个通用的OData GET方法在Swagger文档中多次出现(每种自定义类型一个),并且希望每个方法都显示正确的Response类型,那么您还应该修改SwaggerDocument的路径像:
public class MyDocFilter : Swashbuckle.Swagger.IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
foreach (string path in swaggerDoc.paths.Keys)
{
System.Type mytype = null; // Create custom type...
schemaRegistry.GetOrRegister(mytype);
var response = swaggerDoc.paths[path].get.responses["200"];
if (response.schema == null)
response.schema = new Schema();
response.schema.@ref = "#/definitions/" + mytype.Name;
}
}
}