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?
- 或者數據映射器應該向服務提供原始數據,然後在將數據傳遞給調用者之前使用該數據實例化模型?
我想保留這項服務作爲抽象。數據訪問層可以從ElasticSearch或SQL數據庫或任何其他來源檢索數據。將服務作爲抽象,我可以稍後輕鬆切換數據源,而不必在代碼中重構太高。 – 1sloc
這聽起來像存儲庫模式,而不是我會考慮的服務。對我來說,存儲庫將封裝數據訪問代碼,而服務實際上將具有與之相關聯的業務邏輯/行爲。 https://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/ – tomliversidge
那麼,服務_將有一些邏輯。比方說,例如 'order = OrderService-> fetch(123); OrderService-> applyDiscount(order); OrderService-> persist(order)'。 你會考慮這個存儲庫行爲嗎? – 1sloc