2011-10-11 65 views
0

我有一大堆不同实体的Java服务器应用程序。到目前为止,每个实体顶级实体都有其自己的CRUD服务。就顶级而言,我的意思是能够独立存在的实体树的根。在服务层组织服务?

现在我进入了我的Flex客户端的核心,并发现我需要/写许多不同的查询。但是最好放置这些查询?

说例如,我有一个查询来查找所有“foos”基于他们与某个“栏”的关联。目前该查询位于“foo”服务(findAllByBar)上,但我发现在“bar”服务(findFoos)中使用它(也是?)会非常方便。另一方面,我也可以创建一个查询服务并将所有查询包含在那里。

这是一个很好的做法吗?

回答

1

尝试层中这些观点您的应用程序:

  • 域:设计类像“实体客户“,像”地址“或”颜色“这样的值对象,以及聚合根(如”订单“,其中包括”LineItem“列表)

  • 存储库:这些是实体的数据访问,创建存储库为每个aggre gat根(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); 
    // .... 
    } 
} 
+0

这就是我今天的情况,但考虑客户作为客户实体并且想要获得订单的情况。这应该成为客户服务的新发现者还是客户应该调用您已经拥有的订单服务的查询? – HDave

+0

如果具有客户实体的视图生成请求客户订单的事件,那么它真的会使哪个类满足该请求?视图不需要知道这是怎么发生的,并且服务不应该知道请求发起的地点或者请求的对象知道关于情况的其他信息。 –

+1

HDave:您会在订单服务中添加查找器以查找客户的订单..因为您需要的实体是订单,所以订单服务是提供此信息的适当位置..您也可以考虑将查询服务与商业运营服务类的CQRS理论..所以你可以在OrderQueryService和OrderService –

1

我会把查询在各自的类别,而不是创建一个(bloatable)查询服务

+0

确定 - 但哪一类?或两者? – HDave

+0

foo和bar .. Bar服务都有GetAllBarsByFoo(),而foo服务将有GetAllFoosByBar()方法。这取决于需要哪些方法 –

+0

只是为了阐明,您认为GetAllBarsByFoo必须位于Bars服务中,因为它返回了Bars? – HDave