我需要一个解耦的架构,以便使用相同的请求dto调用不同的服务。
例如。
// A value type has a callback url that will validate the request
public class ValueType {
public string Id {get;set;}
public string CallbackUrl {get;set;}
}
// The request dto to validate a value
public class ValidateRequest : IReturn<ValidateResponse>{
public string ValueTypeId {get;set;}
public string Value {get;set;}
}
// The validation response
public class ValidateResponse {
public bool IsValid {get;set;}
}
我希望能够在多种服务中处理这些问题:
public class Service1 : Service {
public object Get(ValidateRequest input){
return new ValidateResponse(input.Value === "ABC")
}
}
public class Service2 : Service {
public object Get(ValidateRequest input){
return new ValidateResponse(input.Value === "DEF")
}
}
验证调用将在其他服务中提交:
public class AnotherService : Service{
public object Post(ARequest input){
var valueType = _valueTypeRepo.Get(input.type);
var callbackUrl = valueType.callbackUrl;
// callbackUrl = '/api/service1/validate' or '/api/service2/validate'
// Here, I want to call either Service1 or Service2 based on runtime condition
var jsonClient= new JsonClient(callbackUrl);
jsonClient.Get(new ValidateRequest())...
}
}
如何注册多个路由来处理此问题?
在这里,InvoiceService会“了解” CustomerService。但是,CustomerService并不依赖于“ InvoiceService”。这就是我所说的分离架构。多个服务可以添加自定义字段(甚至用户可以添加带有完全为外部API的验证URL的自定义字段),而无需“ CustomerService”对其进行依赖。
答案 0 :(得分:1)
只有一个Service类可以提供Request DTO的实现,如果您需要在其他文件中使用它,则可以使用部分类。它们也只能是Request DTO的单个实现,每个can have multiple routes。
如果绝对需要,您可以让其他请求DTO继承自同一请求DTO,但继承为they’re already declarative I would avoid inheritance,并且如果希望它们能够共享相同的验证逻辑,则可以使它们实现相同的接口。 / p>
对于您要通过运行时代理/委托实现实现的目标,我有些困惑,但是如果您要调用另一个服务,请使用Service Gateway而不是服务客户端,这样可以节省以下开销:内部服务的HTTP服务调用。如果您需要将具有共享属性的请求DTO转换为其他请求DTO,则可以使用ServiceStack's built-in Auto Mapping,因此可以将请求DTO转换为具有共享属性的其他请求DTO,并使用以下命令调用其服务:
var response = Gateway.Send(request.ConvertTo<MyRequest2>());