c# - ServiceStack 将 C# DTO-Class 导出到 dtos.ts 文件
问题描述
如何在npm run typescript-ref http://localhost:5000 src/myproject
不引用请求类的情况下在生成的 dtos.ts 文件中导出 C# 类 (DTO)?
注意:我们有几个 C# DTO 类(MutationAddressChange、MutationCEOChange...),我们使用 automapper 映射到域类。因此,我们希望在 Angular 中也使用 C# DTO 类来填充相应的类型(例如MutationAddressChangesCreateDTO
)并将其发送到 Web 服务器。因此,在CreateMutationRequest
类中,我们接受一个对象而不是一个特定的类。
示例 DTO 类:
public class MutationAddressChangesCreateDTO
{
public string Street { get; set; }
public string POBox { get; set; }
public string Zipcode { get; set; }
}
ServiceStack 请求类
public class CreateMutationRequest : IPost
{
public object Mutation { get; set; }
}
角度预期用途:
{
var mutationAddressChangesCreateDTO= new MutationAddressChangesCreateDTO();
mutationAddressChangesCreateDTO.dateOfMutation = ...
const request = new CreateMutationRequest ({
mutation: mutationAddressChangesCreateDTO,
});
this.client.post(request)
...
}
解决方案
添加 ServiceStack 引用功能的一个限制是您的 DTO 不能具有任何对象或接口属性,这会在您的服务合同中创建一个无法为其生成类型化 API 的黑洞。
我建议不要在您的 DTO 中使用任何对象或接口属性,这些属性除了是运行时问题的来源之外还受到安全限制的限制。
您可以使用无类型数据结构(例如 a来存储任意值),您可以在此客户论坛线程Dictionary<string,string>
中找到其他替代方案。
尽管不鼓励您仍然可以object
在 ServiceStack 请求 DTO 中拥有属性,但您将无法为它们生成类型化 API,但您仍然应该能够将它们作为匿名 arg 发送,例如:
this.client.post(request, { mutation: dto });
默认情况下,对象属性由JS Utils处理,它应该将其反序列化为您应该能够使用 ServiceStack 的Reflection UtilsDictionary<string,object>
将其转换回 C# 类型,例如:
public object Any(CreateMutationRequest request)
{
var payload = request.Mutation as Dictionary<string,object>;
var payloadRequest = payload.FromObjectDictionary(typeof(TheType));
}
避免使用的类似方法object
是在属性中发送序列化的 JSON 有效负载string
,例如:
request.mutation = JSON.stringify(payload);
您可以再次使用 JS Utils 反序列化,例如:
public object Any(CreateMutationRequest request)
{
var payload = JSON.parse(request.Mutation);
var payloadRequest = payload.FromObjectDictionary(typeof(TheType));
}
话虽如此,我不推荐任何这些非类型化策略,并且会亲自为所需的每个 API 创建类型化服务,这更直观、可发现和有弹性,任何共享功能都可以使用 ServiceStack 的AutoMapping和 .NET在您的服务实现中轻松处理强大的反射能力。
推荐阅读
- django - 更改 Wagtail 页面所有者的“一次性”方法
- linux - 替换两列linux
- excel - Excel VBA - 检查日期是否在动态范围内,如果它们具有匹配的名称和标题,然后采取纠正措施
- javascript - 如何使用纯 Javascript 在 webview 应用程序中捕获后退箭头按钮?
- javascript - 将图像数据 URI(base64)设置为画布背景
- email - 如何使用命令'mail'从Unix发送带有不同颜色文本的邮件?
- c# - IPointerClickHandler Unity 的几个问题
- travis-ci - Puppeteer Travis-CI chrome-headless 不工作
- kong - Kong 自定义错误消息/响应
- r - 在 R 中循环遍历列表并连接字符串(语法)