2011-08-04 3 views
-1

내 현재 시점은 저장소가 Add, Delete 등과 같은 엔티티 고유의 수정 메소드를 포함해야하며 UnitOfWork는 일반적으로 Commit (SaveChanges, SubmitChanges) 및 롤백 (ClearChanges라고도 함)이 있습니다. 그러나 UnitOfWork에 관한 article의 Martin Fowler는 UnitOfWork에 모든 수정 방법을 추가 할 것을 제안합니다.Repository vs. UnitOfWork

EF와 NHibernate의 세계에서 어느 쪽이 더 나아 졌는가?

업데이트. 필자가 선호하는 접근 방식을 사용하더라도 저장소를 통한 모든 수정은 EF 컨텍스트 또는 NHibernate Session에 내장 된 UnitOfWork로 진행됩니다. 그리고 내 UnitOfWork는 UnitOfWorkManager (내부 ORM UnitOfWork를 관리)와 더 비슷합니다.

+1

이것이 주제와 다른지 이해하는 것은 흥미로운 일입니다. http://meta.stackexchange.com/questions/101057/why-was-this-question-was-closed-as-off-topic – Dmitry

답변

5

NHibernate 세계에서 UnitOfWork의 주요 기능은 ISession에 의해 구현되었습니다. ISession은 변경된 사항을 추적하며 RegisterClean 또는 RegisterDirty와 같은 메소드를 가질 필요가 없습니다. 큰 프로젝트의 경우 UnitOfWork라고 불릴 수있는 클래스를 사용하여 ISession을 숨기는 것이 좋습니다. 예를 들어 :

public class UnitOfWork { 

    private readonly ISession _session; 

    public void BeginTransaction(); 

    public void Commit(); 

    public void Rollback(); 

    public IRepositoryFactory AllRepositories; 
} 

응용 프로그램 코드에서 ISession을 숨기는의 장점은이 코드가 더 나은 레이어를 적용하는 직접 NHibernate에를 참조 할 것입니다. 즉, 어플리케이션 레이어가 데이터 액세스 레이어를 거치지 않고 직접 NHibernate API를 사용하기 시작하는 것이 더 어려울 것입니다.

자체가 새로운 객체를 추가하고 가능하게 삭제하는 방법을 포함 저장소 :

public interface IOrdersRepository { 

    public IList<Order> FindPending(); 

    public void AddNew(Order order); 

    public void Delete(Order order); 
} 
3

이 두 가지 패턴이 있습니다.

저장소는 상위 계층에서 데이터 저장소를 추출하는 작업을 담당하며, 단행본은 비즈니스 트랜잭션 관리를 담당합니다. 리포지토리를 사용하면 코드를 변경하지 않고 스토리지를 대체 할 수 있습니다. 텍스트 파일, XML, 데이터베이스 등을 사용하여 작업 할 수 있습니다. UoW는 엔티티에 대한 변경 사항을 제어 및 추적하고 한 번에 모든 비즈니스 트랜잭션의 변경 사항을 유지할 수있는 기회를 제공합니다.

EF와 NH는 기본적으로 UoW를 지원하므로 직접 다시 구현할 필요가 없습니다. 여전히 이러한 ORM은 상자를 제공하지 않기 때문에 자신 만의 저장소 패턴을 작성하고자 할 것입니다.

NH 및 EF 상단은 불필요한 추상화 레벨이며 반 패턴 (antipattern)으로 볼 수 있습니다.

Fowler는 실제로 데이터 조작의 책임을 UoW에 추가 할 것을 제안하지 않았습니다. 그가 말하는 것은 트랙 개체를 변경하고 필요에 따라 플러시/롤백을 할 수 있습니다.

+1

NH가 UoW보다 더 많이 상자를 벗어나서 저장소를 지원한다고 주장합니다. – Vadim

+0

@ Vadim 귀하의 의견을 확장하거나 링크를 제공 할 수 있습니까? NH는 저장소로부터 즉시 저장소를 어떻게 지원합니까? – oleksii

+1

ISession은 저장소 역할을하므로 많은 사람들이 응용 프로그램을 손상시키기 위해 쿼리를 추상화하려고합니다. 이제 완전히 다른 이야기가 될 수있는 저장/유효성 확인을위한 것입니다. 그러나 NHibernate를 사용하면 일반적으로 새로운 엔티티 (어쨌든 ISession을 통해 수행됨)를 저장하고 어쨌든 도메인에서 처리해야하는 유효성 검사 (엔티티)에 대해서만 염려 할뿐입니다. – Vadim

관련 문제