我是否应该始终有一个单独的“ DataService”来调用另一个服务?

时间:2019-08-18 21:55:04

标签: java design-patterns microservices software-design

我正在构建一个与其他微服务交互的新的RESTful服务。

常规任务是从另一个RESTful服务中获取一些数据,对其进行过滤,将其与现有数据进行匹配并返回响应。

我的问题是,始终将“获取数据”和“过滤数据”的步骤分为两个不同的类,这是一个好的设计模式,一个叫EntityDataService,第二个叫EntityService

例如,我可以调用一个服务,该服务返回一个必须根据某些条件(例如欧盟或创建日期等)进行过滤的国家/地区列表。

在这种情况下,哪个选项更好:

  • 单独的CountryDataService类,只有一个方法 getAllCountriesEUCountryService对其进行过滤
  • 使用公共方法CountryService使一个类getEUCountriesgetCountriesCreatedInDateRange和私有getAllCountries

哪个更好?

我正在尝试遵循KISS模式,但也希望使我的解决方案可维护和可扩展。

1 个答案:

答案 0 :(得分:1)

在具有大量数据的系统中,拥有方法getAllSomething并不是一个好主意。

如果您没有很多数据,可以拥有它,但仍要小心。

如果您有50条记录,那还不错,但是,如果您有数百万条记录,那将是一个问题。

使用方法Service使用RepositorygetBySomeCriteria是更好的方法。

如果要执行许多不同的查询,则可能会遇到很多方法:getByCriteria1getByCriteria2,...,getByCriteria50。另外,每次您需要不同的查询时,都必须向Service添加新方法。

在这种情况下,您可以使用Specification Pattern。这是一个示例:

public enum Continent { None, Europe, Africa, NorthAmerica, SouthAmerica, Asia }

public class CountrySpecification {

    public DateRange CreatedInRange { get; set; }
    public Continent Location { get; set; }
}

public class CountryService {

    public IEnumerable<Country> Find(CountrySpecification spec) {

        var url = "https://api.myapp.com/countries";
        url = AddQueryParametersFromSpec(url, spec);
        var results = SendGetRequest(url);
        return CreateCountryFromApiResults(results);
    }
}