如何在dtos中导出c#类(DTO) ?在请求类中不引用npm run typescript-ref http://localhost:5000 src/myproject
生成的ts文件?
注意:我们有几个c# DTO类(MutationAddressChange, MutationCEOChange…),我们使用automapper映射到域类。所以我们希望在Angular中也使用c# DTO类来填充相应的类型(例如MutationAddressChangesCreateDTO
)并将其发送到web服务器。因此,在CreateMutationRequest
类中,我们接受一个对象,而不是一个特定的类。
DTO-Class例子:
public class MutationAddressChangesCreateDTO
{
public string Street { get; set; }
public string POBox { get; set; }
public string Zipcode { get; set; }
}
ServiceStack Request-Class
public class CreateMutationRequest : IPost
{
public object Mutation { get; set; }
}
Angular预期用途:
{
var mutationAddressChangesCreateDTO= new MutationAddressChangesCreateDTO();
mutationAddressChangesCreateDTO.dateOfMutation = ...
const request = new CreateMutationRequest ({
mutation: mutationAddressChangesCreateDTO,
});
this.client.post(request)
...
}
Add ServiceStack Reference特性的一个限制是,你的dto不能有任何对象或接口属性,这会在你的服务契约中创建一个黑洞,从而不可能为其生成类型化API。
我建议不要在dto中使用任何对象或接口属性,这些属性不仅是运行时问题的来源,而且还受到安全限制的限制。
您可以使用像Dictionary<string,string>
这样的无类型数据结构来存储任意值,您可以在此客户论坛线程中找到其他替代方案。
虽然它不鼓励你仍然可以在你的ServiceStack请求dto中有object
属性,你只是不能为它们生成一个类型化的API,但你仍然应该能够将它们作为匿名参数发送,例如:
this.client.post(request, { mutation: dto });
对象属性在默认情况下由JS Utils处理,它应该将其反序列化为Dictionary<string,object>
,你应该能够使用ServiceStack的反射Utils转换回c#类型,例如:
public object Any(CreateMutationRequest request)
{
var payload = request.Mutation as Dictionary<string,object>;
var payloadRequest = payload.FromObjectDictionary(typeof(TheType));
}
避免使用object
的类似方法是在string
属性中发送序列化的JSON有效负载,例如:
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的自动映射和. net强大的反射功能,任何共享的功能都可以在你的服务实现中轻松处理。