我有一个包含大量不同实体的Java服务器应用程序。到目前为止,每个实体顶级实体都有自己的CRUD服务。在顶层,我指的是可以独立存在的实体树的根。
现在我进入Flex客户端的核心,发现我需要/编写许多不同的查询。但最好把这些问题放在哪里?
比如说,我有一个查询,根据他们与某个“酒吧”的关联找到所有“foos”。目前该查询是在“foo”服务(findAllByBar)上,但我发现在“bar”服务(findFoos)中使用它(也是?)会非常方便。另一方面,我也可以创建一个查询服务并将所有查询都放在那里。
这是一个很好的做法吗?
答案 0 :(得分:1)
我会将查询放在各自的类中,而不是创建一个(可膨胀的)查询服务
答案 1 :(得分:1)
尝试从这些角度对应用程序进行分层:
域:将您的类设计为“Customer”之类的实体,像“Address”或“Color”这样的值对象,以及聚合根(如“Order”,其中包含“LineItem”列表)
存储库:这些是实体的数据访问,为每个聚合根创建存储库(CustomerRepository,OrderRepository,...)
服务:创建由逻辑业务抽象或有界上下文而非实体分散的粗粒度服务,当所有这些实体都是为客户创建订单和服务以及客户服务时,这是不合逻辑的。代表订单处理的一个原子业务价值,那么您的服务将使用所有必需的存储库来处理数据访问。
示例:
public class OrderRepository {
public Foo getById(int id) {
//
}
public Foo getByCustomer(Customer customer) {
//
}
}
public class CustomerRepository {
public Foo getById(int id) {
//
}
public Foo getByUserName(string userName) {
//
}
}
public class TradingService {
private OrderRepository _orderRepository;
private CustomerRepository _customerRepository;
public TradingService(OrderRepositoryInterface orderRep, CustomerRepositoryInterface cusRep) {
_orderRepository = orderRep;
_customerRepository = custRep;
}
public void placeOrder(string customerUserName, Order order) {
Customer customer = _customerRepository.getByUserName(customerUserName);
order.setCustomer(customer);
_orderRepository.add(order);
// ....
}
}