4

我正在使用主要关注 ServiceStack API 的后端和与之JsonServiceClient交互的 Typescript 前端(带有 ServiceStack )。这是一个大型项目,因此扩展能力非常重要,我们的目标是始终拥有强大的类型执行力。到目前为止一切进展顺利,但我在这里遇到了障碍。

我们有一个实体,我称之为Gadget

public class GadgetDto
{
    public int Id { get; set; }
    // other stuff...
}

通过 AutoQuery,我们有一个返回列表Gadgets 的端点:

[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<GadgetDto>
{
}

但是,需要创建多个Gadgets 类,因此我重构了小工具从基类和接口派生:

public interface IGadget
{
    int Id { get; set; }
}

public abstract class GadgetBase : IGadget
{
    public int Id { get; set; }
}

public class TabbedGadget : GadgetBase
{
    public List<Tab> Tabs { get; set; }
}

我已经重构了我们的端点来代替接口:

[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<IGadget>

这很好用。由于我们使用QueryData,我们可以创建一个List<IGadget>作为响应发回的,包括每个实现类型。

我遇到的问题是为派生类生成 Typescript 类型,例如GadgetBaseTabbedGadget. 我理解为什么它们不是自动生成的,因为 API 元数据中没有使用这些类型,但到目前为止,我不知道如何与 Typescript 客户端通信,列表可能包含实现的具体数量的类型IGadget,以及如何生成这些类型。

有没有办法,通过一些 ServiceStack 属性或通过不同的方法,我可以“强制”生成这些 Typescript 类型并将它们暴露在元数据(/types/typescript)中?

提前谢谢!

4

1 回答 1

4

我强烈建议不要在 DTO 中使用接口,可以让多个 Request DTO 实现相同的接口,但不应使用它来代替具体的 DTO。

话虽如此,您可以创建一个Dummy包含对所有 DTO 的引用的服务,例如:

public class DummyHolder : IReturnVoid
{
    public GadgetDto GadgetDto { get; set; }
    //...
}

public class DummyService : Service
{
    public void Any(DummyHolder request){}
}

或者,您可以将它们添加到您ExportTypes的预定义NativeTypesFeatureAppHost.Configure()

var nativeTypes = this.GetPlugin<NativeTypesFeature>();
nativeTypes.MetadataTypesConfig.ExportTypes.Add(typeof(GadgetDto));
于 2018-02-28T18:59:06.250 回答