ServiceStack - 为某些 类 强制生成 Typescript 类型
ServiceStack - Force generation of Typescript types for certain classes
我正在使用一个主要专注于 ServiceStack API 和与之交互的 Typescript 前端(带有 ServiceStack JsonServiceClient
)的后端。这是一个大型项目,因此扩展能力非常重要,我们的目标是自始至终都具有强大的类型执行能力。到目前为止一切顺利,但我在这里遇到了障碍。
我们有一个实体,我称之为 Gadget
:
public class GadgetDto
{
public int Id { get; set; }
// other stuff...
}
通过 AutoQuery,我们有一个端点 returns 一个列表 Gadget
s:
[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<GadgetDto>
{
}
但是,需要创建 Gadget
的多个 class,因此我重构了小工具,使其派生自基础 class 和接口:
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>
作为响应发回,其中包含每个实现类型。
我遇到的问题是获取为派生的 classes 生成的 Typescript 类型,例如 GadgetBase
和 TabbedGadget
。我明白为什么它们没有自动生成,因为 API 元数据中没有使用这些类型,但到目前为止,我对如何与 Typescript 客户端沟通该列表可能包含具体数量一无所知实现 IGadget
的类型,以及如何生成这些类型。
有没有办法,通过某些 ServiceStack 属性或通过不同的方法,我可以 'force' 生成这些 Typescript 类型并将它们公开在元数据中 (/types/typescript
)?
提前致谢!
我强烈反对 using interfaces in DTOs,让多个请求 DTO 实现相同的接口很好,但它不应该用来代替具体的 DTO。
话虽如此,您可以创建一个 Dummy
服务来保存对所有 DTO 的引用,例如:
public class DummyHolder : IReturnVoid
{
public GadgetDto GadgetDto { get; set; }
//...
}
public class DummyService : Service
{
public void Any(DummyHolder request){}
}
或者,您可以将它们添加到 AppHost.Configure()
中的 pre-defined NativeTypesFeature
中的 ExportTypes
:
var nativeTypes = this.GetPlugin<NativeTypesFeature>();
nativeTypes.MetadataTypesConfig.ExportTypes.Add(typeof(GadgetDto));
我正在使用一个主要专注于 ServiceStack API 和与之交互的 Typescript 前端(带有 ServiceStack JsonServiceClient
)的后端。这是一个大型项目,因此扩展能力非常重要,我们的目标是自始至终都具有强大的类型执行能力。到目前为止一切顺利,但我在这里遇到了障碍。
我们有一个实体,我称之为 Gadget
:
public class GadgetDto
{
public int Id { get; set; }
// other stuff...
}
通过 AutoQuery,我们有一个端点 returns 一个列表 Gadget
s:
[Route("/query/gadgets", HttpMethods.Get)]
public class QueryableGadget : QueryData<GadgetDto>
{
}
但是,需要创建 Gadget
的多个 class,因此我重构了小工具,使其派生自基础 class 和接口:
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>
作为响应发回,其中包含每个实现类型。
我遇到的问题是获取为派生的 classes 生成的 Typescript 类型,例如 GadgetBase
和 TabbedGadget
。我明白为什么它们没有自动生成,因为 API 元数据中没有使用这些类型,但到目前为止,我对如何与 Typescript 客户端沟通该列表可能包含具体数量一无所知实现 IGadget
的类型,以及如何生成这些类型。
有没有办法,通过某些 ServiceStack 属性或通过不同的方法,我可以 'force' 生成这些 Typescript 类型并将它们公开在元数据中 (/types/typescript
)?
提前致谢!
我强烈反对 using interfaces in DTOs,让多个请求 DTO 实现相同的接口很好,但它不应该用来代替具体的 DTO。
话虽如此,您可以创建一个 Dummy
服务来保存对所有 DTO 的引用,例如:
public class DummyHolder : IReturnVoid
{
public GadgetDto GadgetDto { get; set; }
//...
}
public class DummyService : Service
{
public void Any(DummyHolder request){}
}
或者,您可以将它们添加到 AppHost.Configure()
中的 pre-defined NativeTypesFeature
中的 ExportTypes
:
var nativeTypes = this.GetPlugin<NativeTypesFeature>();
nativeTypes.MetadataTypesConfig.ExportTypes.Add(typeof(GadgetDto));