ServiceStack - 为某些类强制生成Typescript类型

问题描述 投票:4回答:1

我正在使用一个后端主要关注ServiceStack API和一个与其交互的Typescript前端(与ServiceStack JsonServiceClient)。这是一个大型项目,因此扩展能力非常重要,我们的目标是在整个过程中实施强大的类型。到目前为止事情进展顺利,但我在这里遇到了麻烦。

我们有一个实体,我称之为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)中?

提前谢谢!

c# typescript servicestack servicestack-autoquery
1个回答
4
投票

我强烈建议不要使用using interfaces in DTOs,让多个Request DTO实现相同的接口是很好的,但不应该用它来代替具体的DTO。

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

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

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

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

var nativeTypes = this.GetPlugin<NativeTypesFeature>();
nativeTypes.MetadataTypesConfig.ExportTypes.Add(typeof(GadgetDto));
© www.soinside.com 2019 - 2024. All rights reserved.