动态创建的C#API方法

时间:2018-10-27 19:06:25

标签: c# api crud

正如标题所述,是否可以动态创建api?我做了一些研究,却找不到任何方法。我有一个拉表中的列的方法。我想从该信息中创建所有CRUD操作。然后可以通过API调用这些操作。让我知道是否不清楚或需要张贴其他内容。

1 个答案:

答案 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 compilerCodeDOMReflection.Emit