我正在构建一个与其他微服务交互的新的RESTful服务。
常规任务是从另一个RESTful服务中获取一些数据,对其进行过滤,将其与现有数据进行匹配并返回响应。
我的问题是,始终将“获取数据”和“过滤数据”的步骤分为两个不同的类,这是一个好的设计模式,一个叫EntityDataService
,第二个叫EntityService
?
例如,我可以调用一个服务,该服务返回一个必须根据某些条件(例如欧盟或创建日期等)进行过滤的国家/地区列表。
在这种情况下,哪个选项更好:
CountryDataService
类,只有一个方法
getAllCountries
和EUCountryService
对其进行过滤CountryService
使一个类getEUCountries
和
getCountriesCreatedInDateRange
和私有getAllCountries
哪个更好?
我正在尝试遵循KISS
模式,但也希望使我的解决方案可维护和可扩展。
答案 0 :(得分:1)
在具有大量数据的系统中,拥有方法getAllSomething
并不是一个好主意。
如果您没有很多数据,可以拥有它,但仍要小心。
如果您有50条记录,那还不错,但是,如果您有数百万条记录,那将是一个问题。
使用方法Service
使用Repository
或getBySomeCriteria
是更好的方法。
如果要执行许多不同的查询,则可能会遇到很多方法:getByCriteria1
,getByCriteria2
,...,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);
}
}