我正在使用一个主要关注ServiceStack API和一个Typescript前端(ServiceStack JsonServiceClient
)与之交互的后端。这是一个大型项目,因此扩展能力非常重要,我们的目标是在整个过程中实施强大的类型。到目前为止事情进展顺利,但我在这里遇到了麻烦。
我们有一个实体,我称之为Gadget
:
public class GadgetDto
{
public int Id { get; set; }
// other stuff...
}
通过AutoQuery,我们有一个返回列表Gadget
的端点:
[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<GadgetDto>
{
}
然而,需要创建多个Gadget
个类,所以我重构了以从基类和接口派生小工具:
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类型,例如GadgetBase
和TabbedGadget
。我理解为什么它们不是自动生成的,因为这些类型没有在API元数据中使用,但到目前为止,我对如何与Typescript客户端进行通信表示列表可能包含实现的具体数量的类型{ {1}},以及如何生成这些类型。
有没有办法,通过一些ServiceStack属性或通过不同的方法,我可以“强制”生成这些Typescript类型并将它们暴露在元数据中(IGadget
)?
提前致谢!
答案 0 :(得分:4)
我强烈推荐using interfaces in DTOs,让多个请求DTO实现相同的界面没问题,但不应该用它来代替具体的DTO。< / p>
话虽如此,您可以创建一个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));