我已经开始使用Typewriter来查看它是否符合生成模型和api层的要求。
到目前为止,它正在生成模型,我让它生成某种类型的api层,但是我在使用$ReturnType
时遇到了障碍,如示例Angular Web API Service中所示。在示例代码中;
${
using Typewriter.Extensions.WebApi;
string ReturnType(Method m) => m.Type.Name == "IHttpActionResult" ? "void" : m.Type.Name;
string ServiceName(Class c) => c.Name.Replace("Controller", "Service");
}
module App { $Classes(:ApiController)[
export class $Name {
constructor(private $http: ng.IHttpService) {
} $Methods[
public $name = ($Parameters[$name: $Type][, ]) : ng.IHttpPromise<$ReturnType> => {
return this.$http<$ReturnType>({
url: `$Url`,
method: "$HttpMethod",
data: $RequestData
});
};]
}
angular.module("App").service("$ServiceName", ["$http", $Name]);]
}
它使用的是
$ReturnType
,但是当您使用方法调用.net webapi控制器时;public async Task<IActionResult> DoSomething(){
return Ok(MyModel);
}
$ReturnType
是IActionResult
,这对我来说还不够强类型。我希望这是MyModel
类型。我能做些什么让类型在
Ok
中返回吗?我可以用一种打字机可以阅读和使用的字体来装饰这个方法吗? 最佳答案
好吧,所以我对这个问题没有答案,所以我会用我目前的解决方案来回答,这样可能会帮助其他人。
我创造了一个新的属性;
public class ReturnTypeAttribute : Attribute
{
public ReturnTypeAttribute(Type t)
{
}
}
然后我用它来装饰我的api方法;
[ReturnType(typeof(MyModel))]
public async Task<IActionResult> DoSomething(){
return Ok(MyModel);
}
现在在我的打字机文件中,我有以下代码;
string ReturnType(Method m) {
if (m.Type.Name == "IActionResult"){
foreach (var a in m.Attributes){
// Checks to see if there is an attribute to match returnType
if (a.name == "returnType"){
// a.Value will be in the basic format "typeof(Project.Namespace.Object)" or "typeof(System.Collections.Generic.List<Project.Namespace.Object>)
// so we need to strip out all the unwanted info to get Object type
string type = string.Empty;
// check to see if it is an list, so we can append "[]" later
bool isArray = a.Value.Contains("<");
string formattedType = a.Value.Replace("<", "").Replace(">", "").Replace("typeof(", "").Replace(")", "");
string[] ar;
ar = formattedType.Split('.');
type = ar[ar.Length - 1];
if (isArray){
type += "[]";
}
// mismatch on bool vs boolean
if (type == "bool"){
type = "boolean";
}
return type;
}
}
return "void";
}
return m.Type.Name;
}
如您所见,我正在检查一个名为“returnType”的属性,然后获取这个属性的值(它是一个字符串),删除一些格式以获取原始对象名,然后返回这个。到目前为止,它很好地满足了我的需要。如果有人能想出更好的解决方案,请告诉我!
这不是我希望的最佳解决方案,因为如果您希望.ts文件中的类型正确,您需要确保
ReturnType(typeof(Object))
。