当服务将数据检索委托给数据映射器时,哪个应该 return 模型?

When a Service delegates data retrieval to a Data Mapper, which one should return a 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 或一个 Product,这里的最佳做法是什么?

我认为数据访问代码负责转换原始数据查询,即SQL 变成一个对象。如果 DataMapper 没有 return 对象,它会映射什么?

我不清楚您为什么需要这里的服务 - 它有什么用?你能不能不做类似

的事情

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 的底层实现。