2

내가 나타났습니다 저장소는 일반적으로 다음 중 한 가지 방법으로 구현됩니다 (DDD : 리포지토리는 개체의 메모리 내 컬렉션입니까?

방법 1

void Add(object obj); 
void Remove(object obj); 
object GetBy(int id); 

방법 1 모음집 의미를 가지고 2

void Save(object obj);  // Used both for Insert and Update scenarios 
void Remove(object obj); 
object GetBy(int id); 

방법하는 저장소가 어떻게 정의되는지). 우리는 저장소에서 객체를 가져 와서 수정할 수 있습니다. 그러나 우리는 컬렉션을 업데이트하도록 지시하지 않습니다. 이런 방식으로 저장소를 구현하려면 메모리 내 개체에 대한 변경 사항을 유지하기위한 또 다른 메커니즘이 필요합니다. 내가 아는 한, 이것은 Unit of Work를 사용하여 수행됩니다. 그러나 UoW는 시스템에서 트랜잭션 제어가 필요할 때만 필요하다고 주장하는 독자도 있습니다.

방법 2에서는 UoW가 필요하지 않습니다. Save() 메서드를 호출하면 개체가 새로운 개체인지, 개체가 삽입되었거나 수정되어야하며 업데이트되어야하는지 여부가 결정됩니다. 그런 다음 데이터 맵퍼를 사용하여 변경 사항을 데이터베이스에 유지합니다. 이로 인해 삶이 ​​훨씬 쉬워 지지만 모델화 된 저장소에는 수집 의미론이 없습니다. 이 모델에는 DAO 의미론이 있습니다.

저는 이것에 대해 정말로 혼란 스럽습니다. 리포지토리가 개체의 메모리 수집을 모방 한 경우 방법 1에 따라 모델링해야합니다.

이 점에 대해 어떻게 생각하십니까?

MOSH

+0

첫 번째 옵션을 사용하며 매우 만족합니다. 나는 현재 NHibernate를 사용하고 있기 때문에 UoW는 무료로 제공된다. – goenning

답변

2

나는 개인적으로 작업 패턴이 솔루션의 일부가되는 단위 아무 문제가 없습니다. 분명히 CRUD에서 CUD를 위해서만 필요합니다. UoW 패턴을 구현한다는 사실은 일괄 처리가 필요한 일련의 작업이 필요하다는 것 이상을 의미하지는 않습니다. 그것은 이 거래의 일부가되도록이 필요하다고 말하는 것과 약간 다릅니다. 리포지토리를 충분히 추상화하면 UoW 구현은 사용중인 지원 메커니즘 (데이터베이스, XML 등)에 상관없이 불가능할 수 있습니다.

특정 질문에 대해서는 방법 1과 메소드 2의 대부분 인스턴스가 식별자가 설정되어 있는지 확인하기위한 점검을 포함하는 다른 이유가 없으면 메소드 2는 사소한 것입니다. 설정되면 업데이트로 처리하고, 그렇지 않으면 삽입으로 처리합니다. 이 논리는 저장소에 내장되는 경우가 많으며 노출 된 인터페이스를 단순화하기 위해 더 많이 사용됩니다. 리포지토리의 목적은 소비자와 데이터 소스간에 객체를 브로커 (broker)하고 데이터 소스에 대한 지식을 직접 가지고 있어야하는 것을 제거하는 것입니다. 두 가지 방법을 사용합니다. 왜냐하면 응용 프로그램 전체에서 개체 상태를 추적해야하는 것보다 식별자를 검색하는 간단한 논리를 신뢰하기 때문입니다.

저장소 사용에 대한 용어가 데이터 액세스 및 개체 수집과 매우 비슷하다는 사실 때문에 혼동을 야기합니다. 나는 그 (것)들을 그들의 자신의 일등 시민으로 대우하고 영역을 위해 최상 인 무슨을한다. ;-)

1

은 아마 당신은하고 싶지 :

T Persist(T entityToPersist); 
void Remove(T entityToRemove); 

은 "다른 이름으로 저장 또는 업데이트"또는 "추가 또는 업데이트"와 같은 존재 "지속"- 예. Repo는 새로운 ID 생성을 캡슐화하지만 (db는이를 수행 할 수 있음) 항상 신원 참조로 새 인스턴스를 반환합니다.