Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否应该始终有一个单独的;“数据服务”;make调用另一个服务?_Java_Design Patterns_Microservices_Software Design - Fatal编程技术网

Java 我是否应该始终有一个单独的;“数据服务”;make调用另一个服务?

Java 我是否应该始终有一个单独的;“数据服务”;make调用另一个服务?,java,design-patterns,microservices,software-design,Java,Design Patterns,Microservices,Software Design,我正在构建一个与其他微服务交互的新的RESTful服务 例行任务是从另一个RESTful服务获取一些数据,对其进行过滤,将其与现有数据进行匹配,然后返回响应 我的问题是,在两个不同的类中始终将“获取数据”和“过滤数据”这两个步骤分开,并将其中一个命名为EntityDataService,第二个简单地命名为EntityService,这是一种好的设计模式吗 例如,我可以调用一个服务,该服务返回一个国家列表,这些国家必须根据某些条件进行筛选,如是否包含在欧盟或创建日期等 在这种情况下,哪个选项更好:

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

例行任务是从另一个RESTful服务获取一些数据,对其进行过滤,将其与现有数据进行匹配,然后返回响应

我的问题是,在两个不同的类中始终将“获取数据”和“过滤数据”这两个步骤分开,并将其中一个命名为
EntityDataService
,第二个简单地命名为
EntityService
,这是一种好的设计模式吗

例如,我可以调用一个服务,该服务返回一个国家列表,这些国家必须根据某些条件进行筛选,如是否包含在欧盟或创建日期等

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

  • 分离只有一个方法的
    CountryDataService
    getAllCountries
    和过滤它们的
    EUCountryService
  • 使用公共方法创建一个类
    CountryService
    ,并
    getCountriesCreatedInDateRange
    和private
    getAllCountries
哪一个更好


我试图遵循
KISS
模式,但也希望使我的解决方案具有可维护性和可扩展性。

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

如果你没有太多的数据,也可以拥有,但还是要小心

如果你有50张唱片,也没那么糟糕,但如果你有数百万张唱片,那就成问题了

使用方法
getBySomeCriteria
服务
存储库
是更好的选择

如果您有许多不同的查询需要执行,那么您可能会得到许多方法:
getByCriteria1
getByCriteria2
,…,
getByCriteria50
。此外,每次需要不同的查询时,都必须向
服务添加新方法

在这种情况下,您可以使用。下面是一个例子:

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);
    }
}
公共枚举大陆{无、欧洲、非洲、北美洲、南美洲、亚洲}
公共类规范{
公共日期范围CreatedInRange{get;set;}
公共位置{get;set;}
}
公共服务{
公共IEnumerable查找(CountrySpecification){
变量url=”https://api.myapp.com/countries";
url=AddQueryParametersFromSpec(url,spec);
var results=SendGetRequest(url);
返回CreateCountryFromApiResults(结果);
}
}

我明白了,但你回答的问题略有不同。我的新服务不与数据库交互,只通过另一个服务公开的API从数据库中获取数据。这只是一个示例,说明了如何对数据库使用
规范。。您可以在API中使用相同的想法。您可以将参数添加到API中,并使用与
规范相同的代码。我将编辑我的答案以使用RESTful api而不是DB