从未知对象(.net)生成一个大文件。

问题描述 投票:1回答:1

我想开发一个新的API。它必须将Dynamics CRM和前端开发人员联系起来。

今天,开发的“解决方法是:

  1. 用Excel文件描述CRM和自定义对象(使用fetchXml,...)
  2. 写入并连接字符串以写入YAML文件。
  3. 将此文件复制到swagger编辑器并使用Postman进行测试

第一步,我想生成没有字符串连接的架构...(暂时,等待用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,我不知道这是否是错误的方法...

reflection swagger dynamics-crm reflection.emit swagger-codegen
1个回答
0
投票

您可以实现并注册一个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;
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.