Несколько сервисов, обрабатывающих тип запроса - PullRequest
1 голос
/ 19 мая 2019

Мне нужно для разъединенной архитектуры вызывать другую службу, используя один и тот же запрос 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;}
}

Я хочу иметь возможность обрабатывать их несколькимиservices:

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».Это то, что я имею в виду под отделенной архитектурой.Несколько служб могут добавлять настраиваемые поля (или даже пользователи могут добавлять настраиваемые поля с URL-адресом проверки, являющимся полностью внешним API), при этом «CustomerService» не должен зависеть от них.

1 Ответ

1 голос
/ 20 мая 2019

Только один класс Service может обеспечить реализацию Request DTO, если вам это нужно в разных файлах, вы можете использовать частичные классы.Они также могут быть только одной реализацией для запроса DTO, каждый из которых может иметь несколько маршрутов .

Если вам абсолютно необходимо, вы можете иметь другие запросы DTO, наследуемые от того же самогоЗапросите DTO, но поскольку они уже декларативны, я бы избежал наследования и просто заставил бы их реализовать один и тот же интерфейс, если вы хотите, чтобы они могли использовать ту же логику проверки.

Янемного запутался в том, что вы пытаетесь достичь с помощью реализации прокси / делегирования во время выполнения, но если вы хотите вызвать другую службу, используйте Service Gateway вместо клиента службы, который экономит издержки службы HTTPвызов для внутренних служб.Если вам нужно преобразовать DTO-запрос с общими свойствами в другой DTO-запрос, вы можете использовать встроенное автоматическое сопоставление ServiceStack , чтобы вы могли преобразовать DTO-запрос в другой DTO-запрос с общими свойствами и вызвать его.Служба с:

var response = Gateway.Send(request.ConvertTo<MyRequest2>());
...