2011-10-11 133 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