正如标题所述,是否可以动态创建api?我做了一些研究,却找不到任何方法。我有一个拉表中的列的方法。我想从该信息中创建所有CRUD操作。然后可以通过API调用这些操作。让我知道是否不清楚或需要张贴其他内容。
答案 0 :(得分:2)
这是使用T4模板生成代码的一种可行解决方案。 T4模板可由Visual Studio开箱即用。有关更多详细信息,请查看documentation有关使用T4文本模板生成代码的信息。
对于该示例,我创建了一个包含文件Common.t4,该文件具有检索模型信息的功能。如果您已经有了一个可以使用的库,则可以直接在模板中导入程序集,并且不需要通用的代码文件。为了简单起见,我仅在函数中返回静态数据,然后您必须通过调用获取数据的方法来实现它。
示例公用文件:
<#@ import namespace="System" #>
<#+
public string[] GetEntities()
{
// TODO: implement logic to get entitities
return new string[] { "Entity01", "Entity02", "Entity03" };
}
public class FieldDefinition
{
public string Name { get; set;}
public Type Type { get; set; }
}
public FieldDefinition[] GetEntityFields(string entityName)
{
// TODO: Implement retrieval of Entity fields
return new FieldDefinition[]
{
new FieldDefinition() { Name = "Id", Type = typeof(int) },
new FieldDefinition() { Name = "Name", Type = typeof(string) }
};
}
#>
一旦有了该通用功能,就可以为模型创建一个T4模板文件,为控制器创建一个。
这是一个示例模型模板:
<#@ template hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ include file="Common.t4" #>
using System;
using System.Collections.Generic;
using System.Linq;
namespace WebApplication3.Models
{
<#
foreach (string entity in GetEntities())
{
#>
public class <#=entity#>Model
{
<#
foreach (FieldDefinition fieldDefinition in GetEntityFields(entity))
{
#>
public <#= fieldDefinition.Type.FullName#> <#= fieldDefinition.Name#> { get; set; }
<#
}
#>
}
<#
}
#>
}
最后是Controllers模板:
<#@ template hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ include file="Common.t4" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WebApplication3.Models;
namespace WebApplication3.Controllers
{
<#
foreach (string entity in GetEntities())
{
#>
[Produces("application/json")]
[Route("api/<#=entity#>")]
public class <#=entity#>Controller : Controller
{
// GET: api/<#=entity#>
[HttpGet]
public IEnumerable<<#=entity#>Model> Get()
{
return new <#=entity#>Model[] { new <#=entity#>Model(), new <#=entity#>Model() };
}
// GET: api/<#=entity#>/5
[HttpGet("{id}", Name = "Get")]
public <#=entity#>Model Get(int id)
{
return new <#=entity#>Model();
}
// POST: api/<#=entity#>
[HttpPost]
public void Post([FromBody]<#=entity#>Model value)
{
}
// PUT: api/<#=entity#>/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]<#=entity#>Model value)
{
}
// DELETE: api/<#=entity#>/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
<#
}
#>
}
还有许多其他商业和免费代码生成工具可用。检查以下链接:Comparison of code generation tools。如果您不喜欢T4或缺少某些功能,那么它也可以替代T4。
最后,我还提到了可以在运行时用于完全动态代码生成的技术。在这种情况下,您可以使用Roslyn compiler,CodeDOM或Reflection.Emit。