2011-10-11 4 views
0

다른 엔티티가있는 Java 서버 응용 프로그램이 있습니다. 지금까지 각 엔티티 최상위 엔티티에는 자체 CRUD 서비스가 있습니다. 최상위로, 나는 독립 할 수있는 엔티티 트리의 루트를 의미합니다.서비스 계층에서 서비스 조직?

이제 플렉스 클라이언트의 핵심으로 다가 가고 많은 다른 쿼리를 필요로하거나 작성하고 있습니다. 그러나이 쿼리를 어디에 넣어야할까요?

예를 들어, 특정 "막대"와 관련하여 모든 "foos"를 찾는 쿼리가 있습니다. 현재이 쿼리는 "foo"서비스 (findAllByBar)에 있지만, "bar"서비스 (findFoos)에서 가져와도 매우 편리 할 것입니다. 반면에 쿼리 서비스를 생성하고 거기에 모든 쿼리를 일괄 처리 할 수도 있습니다.

여기서 무엇을 할 수 있습니까?

답변

1

시도를 만드는 각각의 클래스에 쿼리를 둘 것 :

  • 도메인 : "와 같은 개체로 클래스를 디자인 고객 ","주소 "또는"색상 "과 같은 값 개체 및"LineItem "목록이 포함 된"주문 "과 같은 집계 루트

  • 리포지토리 : 이들은 엔티티에 대한 데이터 액세스이며 저장소를 만듭니다 각 aggre에 대해 gat root (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 이론의 비즈니스 운영 서비스 일종 .. OrderService –

1

내가 대신 이러한 관점에서 응용 프로그램 레이어 하나 (bloatable) 쿼리 서비스를

+0

OK - 그러나 어떤 클래스? 아니면 둘다? – HDave

+0

foo와 bar 모두 바 서비스는 GetAllBarsByFoo()를 가지고 foo 서비스는 GetAllFoosByBar() 메소드를 갖습니다. 어떤 메소드가 필요한지에 따라 달라집니다. –

+0

GetAllBarsByFoo가 바를 반환하기 때문에 Bars 서비스에 있어야한다는 것을 명확히하기 위해서입니다. – HDave

관련 문제