当服务将数据检索委托给数据映射器时,哪个应该 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,这里的最佳做法是什么?
- Data Mapper 是否应该创建这些模型的实例并将它们 return 发送给服务,服务再将它们传递给 Actor?
- 或者数据映射器是否应该将原始数据提供给服务,然后在将模型传递给调用者之前使用该数据实例化模型?
我认为数据访问代码负责转换原始数据查询,即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 的底层实现。
我已经建立了一个基本架构,其中服务将数据检索委托给数据映射器(下面的伪代码)。
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,这里的最佳做法是什么?
- Data Mapper 是否应该创建这些模型的实例并将它们 return 发送给服务,服务再将它们传递给 Actor?
- 或者数据映射器是否应该将原始数据提供给服务,然后在将模型传递给调用者之前使用该数据实例化模型?
我认为数据访问代码负责转换原始数据查询,即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 的底层实现。