2016-07-06 5 views
2

서비스가 데이터 매퍼 (아래의 의사 코드)에 데이터 검색을 위임하는 기본 아키텍처를 설정했습니다.서비스가 데이터 검색을 데이터 매핑 프로그램에 위임하면 모델을 반환해야합니까?

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라고 가정 해 보겠습니다. 여기서 가장 좋은 방법은 무엇입니까?

  • 데이터 매퍼가이 모델의 인스턴스를 만들고이를 서비스로 반환하면 서비스로 전달됩니까?
  • 데이터 맵퍼가 원시 데이터를 서비스에 제공하면 호출자에게 전달하기 전에 해당 데이터로 모델을 인스턴스화합니까?

답변

3

원시 데이터 쿼리를 변환하는 것은 데이터 액세스 코드의 책임이라고 생각합니다. 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

그건 내가 서비스라고 생각하는 것보다는 저장소 패턴처럼 들린다. 저에게 저장소는 데이터 액세스 코드를 캡슐화하는 반면 서비스는 실제로 비즈니스 로직/동작을 연관시킵니다. htt38://lostechies.com/jimmybogard/2009/09/03/ddd-repository-implementation-patterns/ – tomliversidge

+0

글쎄, 서비스에는 약간의 논리가 있어야합니다. 예를 들어, 'order = OrderService-> fetch (123); OrderService-> applyDiscount (order); OrderService-> persist (order)'입니다. 이 저장소 동작을 고려해 보시겠습니까? – 1sloc