多种服务处理请求类型

时间:2019-05-19 20:21:49

标签: routing servicestack

我需要一个解耦的架构,以便使用相同的请求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())...

}

}

如何注册多个路由来处理此问题?

Example of architecture

在这里,InvoiceService会“了解” CustomerService。但是,CustomerService并不依赖于“ InvoiceService”。这就是我所说的分离架构。多个服务可以添加自定义字段(甚至用户可以添加带有完全为外部API的验证URL的自定义字段),而无需“ CustomerService”对其进行依赖。

1 个答案:

答案 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>());