C# 在c中创建另一个Api的Web Api#
我的要求是在c#中创建一个web api,它将根据文档创建另一个api。 用户将发送新api需要执行的api名称、操作方法名称、请求和操作类型,我们的api将创建所需的api并返回包含api url和请求/响应类型的响应C# 在c中创建另一个Api的Web Api#,c#,asp.net-mvc,asp.net-web-api2,C#,Asp.net Mvc,Asp.net Web Api2,我的要求是在c#中创建一个web api,它将根据文档创建另一个api。 用户将发送新api需要执行的api名称、操作方法名称、请求和操作类型,我们的api将创建所需的api并返回包含api url和请求/响应类型的响应 我在很多不同的网站上搜索过,但没有找到任何与之相关的东西。如果有人对此有解决方案或任何相近的想法,请分享。我需要在asp.net MVC中执行此操作,我有一个示例程序,它使用CodeDomCompiler为任何给定接口生成标准遥测实现。代码被编译到内存并加载到地址空间。这听起来
我在很多不同的网站上搜索过,但没有找到任何与之相关的东西。如果有人对此有解决方案或任何相近的想法,请分享。我需要在asp.net MVC中执行此操作,我有一个示例程序,它使用CodeDomCompiler为任何给定接口生成标准遥测实现。代码被编译到内存并加载到地址空间。这听起来像是你要做的。如果是这样,尝试使用示例生成一些代码,并在遇到问题时提问 这可能会帮助你开始
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using TelemeterFactory;
namespace ConsoleTelemeter
{
/// <summary>Generate a CSharp Telemeter that calls Console.WriteLine as its output.</summary>
public class Factory : FactoryBase
{
public override string[] GenerateSource(SourceGenerationOptions options)
{
var generatedClassName = options.Type.Name + "_" + options.FactoryOptions.ClassName;
var text = this.CSharpTemplate()
.Replace("<codeGenerationTool>", $"{nameof(ConsoleTelemeter)} {Assembly.GetExecutingAssembly().GetName().Version} {DateTimeOffset.UtcNow:yyyy-MM-dd HH:mm:ss zzz}")
.Replace("<generatedNamespace>", options.FactoryOptions.Namespace)
.Replace("<generatedClassName>", generatedClassName)
.Replace("<interfaceImplemented>", options.Type.FullName)
.Replace("//<privateFields>", "private const string Null = \"<null>\";")
.Replace("//<publicMethodImplementations>", Methods(options.Methods))
.Replace("\t", " ")
;
return new[] { text, $"{options.FactoryOptions.Namespace}.{generatedClassName}" };
}
private string Methods(IReadOnlyList<MethodInfo> methods)
{
var sb = new StringBuilder(4096);
foreach (var method in methods)
{
// method start
sb.AppendFormat("\n\t\tpublic {0} {1} (", method.ReturnType, method.Name);
var comma = string.Empty;
foreach (ParameterInfo parameter in method.GetParameters())
{
sb.AppendFormat("{0}{1} {2}", comma, parameter.ParameterType, parameter.Name);
comma = ", ";
}
sb.Append(") {\n");
sb.Append("\t\t\tvar result = $\"{DateTimeOffset.UtcNow:yyyy-MM-dd HH:mm:ss.ffffff} ");
sb.Append("{nameof(");
sb.Append(method.Name);
sb.Append(")}: ");
comma = string.Empty;
foreach (ParameterInfo parameter in method.GetParameters())
{
var t = parameter.ParameterType;
sb.AppendFormat("{0}{{nameof({1})}}={{", comma, parameter.Name);
// special case for boolean parameters to be coerced to strings below. Not strictly necessary for this Telemeter but show how one could do it if necessary.
sb.AppendFormat("{1}{0}", parameter.Name, t == typeof(Boolean) ? "(" : string.Empty);
if (t == typeof(string))
{
sb.Append(" ?? Null");
}
else if (t == typeof(Int32)
|| t == typeof(float)
|| t == typeof(double)
|| t == typeof(Int64)
|| t == typeof(decimal)
|| t == typeof(Int16))
{
sb.Append(":#0");
}
else if (t.BaseType == typeof(Enum))
{
sb.Append(":D");
}
else if (t == typeof(Boolean))
{
sb.Append("? \"1\" : \"0\")");
}
else
{
sb.Append(".ToString() ?? Null");
}
sb.Append("}");
comma = ",";
}
sb.Append("\";\n\t\t\treturn result;\n");
// method end
sb.Append("\t\t}\n");
}
return sb.ToString();
}
}
}
使用系统;
使用System.Collections.Generic;
运用系统反思;
使用系统文本;
使用遥测工厂;
名称空间控制台计数器
{
///生成调用Console.WriteLine作为其输出的CSharp遥测仪。
公共类工厂:FactoryBase
{
公共重写字符串[]GenerateSource(SourceGenerationOptions选项)
{
var generatedClassName=options.Type.Name+“”+options.FactoryOptions.ClassName;
var text=this.CSharpTemplate()
.Replace(“,$”{nameof(ConsoleTelemeter)}{Assembly.getExecutionGassembly().GetName().Version}{DateTimeOffset.UtcNow:yyyy-MM-dd-HH:MM:ss-zzz}”)
.Replace(“,options.FactoryOptions.Namespace)
.Replace(“,generatedClassName)
.Replace(“,options.Type.FullName)
.Replace(“/”,“private const string Null=\“\”;”)
.Replace(“/”,方法(options.Methods))
.替换(“\t”,”)
;
返回新的[]{text,$“{options.FactoryOptions.Namespace}.{generatedClassName}”;
}
私有字符串方法(IReadOnlyList方法)
{
var sb=新的StringBuilder(4096);
foreach(方法中的var方法)
{
//方法开始
sb.AppendFormat(“\n\t\tpublic{0}{1}”(,method.ReturnType,method.Name);
var逗号=string.Empty;
foreach(方法.GetParameters()中的ParameterInfo参数)
{
sb.AppendFormat(“{0}{1}{2}”,逗号,parameter.ParameterType,parameter.Name);
逗号=“,”;
}
某人附加(“){\n”);
sb.Append(“\t\t\tvar result=$\”{DateTimeOffset.UtcNow:yyyy-MM-dd-HH:MM:ss.ffffffff}”);
某人附加(“{nameof(”);
sb.Append(方法名称);
某人加上(“)}:”;
逗号=string.Empty;
foreach(方法.GetParameters()中的ParameterInfo参数)
{
var t=parameter.ParameterType;
sb.AppendFormat(“{0}{{nameof({1}}}}}={{”,逗号,parameter.Name);
//将布尔参数强制为以下字符串的特殊情况。对于此遥测仪来说,这不是严格必需的,但说明了如何在必要时执行此操作。
sb.AppendFormat(“{1}{0}”,parameter.Name,t==typeof(Boolean)?”(“:string.Empty);
if(t==typeof(string))
{
sb.追加(“?空”);
}
else if(t==typeof(Int32)
||t==类型(浮动)
||t==typeof(双精度)
||t==typeof(Int64)
||t==类型(十进制)
||t==typeof(Int16))
{
某人附加(“:#0”);
}
else if(t.BaseType==typeof(Enum))
{
某人加上(“:D”);
}
else if(t==typeof(Boolean))
{
某人追加(“?\”1\:\”0\”);
}
其他的
{
sb.追加(“.ToString()?”空”);
}
某人附加(“}”);
逗号=“,”;
}
sb.追加(“\”;\n\t\t\t返回结果;\n”);
//方法端
sb.追加(“\t\t}\n”);
}
使某人返回字符串();
}
}
}
这是一个非常广泛的问题,一般来说,您试图设计的体系结构将过于复杂、高度不安全,并且几乎无法维护。此设计决策的目的是什么?谁是此系统的预期用户,他们都对代码有足够的了解,知道您的数据结构是什么样的eed自定义API,但同时无法将其所需的API直接添加到服务器代码中?一般来说,我必须每天制作大量API(每天3-4个API)对于我的项目,基本上是为了crud操作等。所以为了节省制作这些api的时间,我决定制作一个能够创建api的api。我知道这不是我能在1-2天内完成的事情。但我认为创建这种应用程序是可能的。感谢您的关注。这并不是解决此类问题的正确方法嗯,不过。如果你想通过重复或不断重复使用样板代码来节省自己的工作量,你可能想看看设计用来处理这类事情的工具,比如PostSharp。是的,我认为你是对的,在制作这个应用程序上浪费时间对我来说是不值得的。我想我还不足以做到这一点他一个人申请。PostSharp是个不错的选择,我想我应该去。谢谢你的建议。你会怎么做