2016-07-06 25 views
2

我已經建立了一個基本的體系結構,其中一個服務委託數據檢索到數據映射器(下面的僞代碼)。當一個服務將數據檢索委託給一個Data Mapper時,哪一個應該返回一個Model?

ProductService->fetchById(123); 

class ProductService 
{ 
    public function fetchById(id) 
    { 
     product = ProductMapper->fetch('id', id); 
     // or product = new Product(ProductMapper->fetch('id', id)) ? 
     return product; 
    } 
} 

class ProductMapper 
{ 
    public function fetch(bySomething, value) 
    { 
     // fetch stuff from DB. 
     // return new Product or just raw data? 
    } 
} 

什麼是最好的做法在這裏,如果我想結束了,讓我們說,一個ProductCollection,還是產品?

  • Data Mapper是否應該創建這些模型的實例並將它們返回給服務,並將它們傳遞給Actor?
  • 或者數據映射器應該向服務提供原始數據,然後在將數據傳遞給調用者之前使用該數據實例化模型?

回答

3

我認爲這是數據訪問代碼轉換原始數據查詢I.e.的責任。 SQL轉換爲對象。如果DataMapper沒有返回一個對象,它會映射什麼?

我不清楚爲什麼你需要一個服務雖然在這裏 - 它是爲了什麼?你能不能只是做類似

VAR theObject = theDataAccessThing.get(someId)

[更新]

如果服務有邏輯我想結構(C#示例)的代碼是這樣的:

public class OrderService 
{ 
    private readonly IOrderRepository _orderRepository; 
    public OrderService(IOrderRepository repository){ 
     _orderRepository= repository 
    } 

    public void ApplyDiscount(orderId){ 
     var order = _orderRepository.Get(orderId); 
     order.ApplyDiscount(); 
     _orderRepository.Save(order); 
    } 
} 

或靜態:

public static class OrderService 
{ 
    public static void ApplyDiscount(IOrderRepository orderRepository, int someOrderId) 
    { 
     var order = orderRepository.Get(orderId); 
     order.ApplyDiscount(); 
     orderRepository.Save(order); 
    } 
} 

這使得易於測試,以及允許您根據需要更改IOrderRepository的底層實現。

+0

我想保留這項服務作爲抽象。數據訪問層可以從ElasticSearch或SQL數據庫或任何其他來源檢索數據。將服務作爲抽象,我可以稍後輕鬆切換數據源,而不必在代碼中重構太高。 – 1sloc

+1

這聽起來像存儲庫模式,而不是我會考慮的服務。對我來說,存儲庫將封裝數據訪問代碼,而服務實際上將具有與之相關聯的業務邏輯/行爲。 https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/ – tomliversidge

+0

那麼,服務_將有一些邏輯。比方說,例如 'order = OrderService-> fetch(123); OrderService-> applyDiscount(order); OrderService-> persist(order)'。 你會考慮這個存儲庫行爲嗎? – 1sloc

相關問題