首页 > 解决方案 > 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)
    ...
}

标签: c#angularservicestack

解决方案


添加 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在您的服务实现中轻松处理强大的反射能力。


推荐阅读