2009-10-15 4 views
3

DDD를 완전히 수행하지는 않지만 리포지토리 패턴이 매력적이며 집계 루트 경계를 따라 저장소를 분할하려고합니다. 엔티티 프레임 워크 위에 리포지토리를 구현하고 있습니다. 여기에서 ObjectContext는 엔터티에 대한 변경 내용을 추적하고 SaveChanges가 호출 될 때 적절한 SQL을 생성 할 때 작업 단위 스타일을 허용합니다.작업 단위 또는 ActiveRecord가있는 저장소 patten의 위치가 어느 정도 일치합니까?

저장소 내에서 SaveChanges를 호출 할 때 서로 다른 두 가지 접근 방식으로 어려움을 겪고 있습니다. 단점은 내가 단위 작업 (unit-of-work) 또는 활성 레코드 의미론을 채택하고있는 것처럼 보입니다. 내가 저장소 인터페이스를 정의하면 다음과 같이보고 :

public void Add(Document entity) 
    { 
     DB.AddToDocumentSet(entity); 
     GetUnitOfWork().SaveChanges(); //delegates to the ObjectContext's SaveChanges 
    } 
:

public interface IRepository<T> 
{ 
    T Get(int id); 
    IList<T> GetAll(); 
    IQueryable<T> Query(); 
    void Delete(T entity); 
    void Add(T entity); 
    IUnitOfWork GetUnitOfWork(); 
} 

및 IUnitOfWork을

public interface IUnitOfWork 
{ 
    void SaveChanges(); 
} 
추가 (T 엔티티)에서 다음

구현으로, 나는 두 가지 선택을 갖고있는 것 같다

또는

public void Add(Document entity) 
    { 
     DB.AddToDocumentSet(entity); 
    } 

전자의 경우 저장소의 Add 메서드가 각 작업에서 SQL을 보냅니다. 후자의 경우 호출 코드는 저장소에서 작업 단위 (UOW)를 확보하고 적절한 것으로 판단되면 SaveChanges를 호출합니다. 이렇게하면 작업 단위가 다른 저장소로 확장 될 수 있습니다 (각 저장소가 해당 구조에서 동일한 작업 단위를 확보하도록 보장합니다).

나의 두 번째 접근 방식은 더 유연하다는 느낌입니다. 작업 단위 패턴을 채택한다는 것은 호출 코드가 리포지토리에서 반환 한 엔터티의 속성을 간단히 업데이트 한 다음 UnitOfWork.SaveChanges를 호출한다는 점에서 엔티티에 대한 업데이트가 조금 더 멋지다는 것을 의미합니다.

저장소 패턴을 사용할 때 일반적으로 다른 방법보다 선호되는 방법이 있습니까?

답변

2

이것은 명시하지 않은 오류 모드 요구 사항에 따라 다릅니다. 이것은 주로 작업 단위 중에 _ 생하는 실패를 처리하는 f}에 대한. 제점입니다. 가능한 다른 복잡한 변종이 있지만 기본적으로 두 가지 선택이 가능합니다.

  1. 오류가 발생할 때까지 작업 단위 중에 발생한 모든 변경 사항을 저장하십시오.
  2. 실패로 인해 작업 단위 (UOW) 중에 발생한 모든 변경 사항을 롤백합니다. 2.

    시나리오 1은 가능성이 사용자가 실패의 지점에서 다시 시작 할 수 있도록 스마트 응용 프로그램 코드를 필요로

첫 번째 추가 방법은 시나리오 1에 더 적합하고 두 번째 추가 방법은 시나리오에 더 적합 . 시나리오 2는 응용 프로그램 측면에서 구현하기가 더 쉽지만 예를 들어 실패한 경우 9 단계 프로세스로 8 단계가 진행되는 경우 사용자를 좌절시킬 수 있습니다.