2009-04-15 2 views
4

나는 임피던스 불일치로 운명 지어 질지 모르지만 나는 IRepository와 불변의 대상에 대해 본 적이있는 예제들을 조화 시키려고 노력하고있다.저장소 및 변경 불가능 개체?

나는 웹 요청의 hundrd가 제품의 '작업 세트'에서 작동하는 카탈로그 응용 프로그램에서 작업하고 있습니다. 전체 카탈로그의 하위 집합은 주어진 시간에 재생되는 경향이 있습니다. 우리의 데이터 팀이 지속적으로 제품 데이터 업데이트 동시에

- 새로운 이미지 업데이트 가격, 설명, 등 등

성능을 위해 내가 불변으로 제품을 고려 더 잘 해요 나에게 보인다 . 저장소에 의해로드되고 캐시되며 많은 스레드가 동시에 동일한 제품 오브젝트에 액세스 할 수 있습니다.

그러나이 아이디어는 업데이트/삭제 메소드에서 본 IRepository 예제의 많은 부분에서 깨져 보입니다. 스레드가 제품에 쓸 수있게되면 곧 내 자신이 인종 및 기타 불쾌감을 불러 일으키는 것처럼 보입니다.

그래서 필자는 변경 사항을 유지하고 문제의 제품을 모든 사용자가 사용할 수 있도록 다시로드해야하는 동반자 '편집자'개체를 통해 엔티티에 대한 변경을 수행하는 '편집기'모델을 구상했습니다. 제품은 절대 변경되지 않으며 외부에서 '수정'되어 다시로드됩니다.

이 말이 맞는가요? 설명 된 것처럼 저장소에서이 작업을 수행 할 수 있습니까?

시간 내 주셔서 감사합니다.

답변

4

저장소는 데이터 검색/저장에 대해서만 책임이 있습니다. 팩토리는 새로운 객체를 생성합니다.

당신의 경우에는 변경 불가능한 개체가 좋습니다. 그러나 당신은 어떤 방법을 필요로 superseeded 제품을 무효로하고 저장소 캐시에서 제거합니다. 매달린 참조는 검색시 유효하기 때문에 대부분의 경우 무시 될 수 있습니다.

제품 업데이트의 경우 공장을 통해 새 제품을 만들어야합니다. 리포지토리에는 Retrieve (또는 Find), Save 및 Supersede의 세 가지 작업 종류 만 포함됩니다. 여기서 저장은 변경되지 않은 새 제품을 저장합니다. 그리고 Supersede는 새 제품을 저장하고 이전 버전을 무효화하고 캐시에서 제거합니다. C#을 서명의 측면에서

나는 다음과 같은 모양을 취할 수있는 두 가지 저장 방법을 상상할 수 :

void Save(Product product); 

void Supersede(Product oldProduct, Product newProduct); 

도움이 되었기를 바랍니다.

+0

아마도 Michael Haren이 제안한 '편집 잠금'을 사용하는 것이 좋습니다. 감사합니다. – n8wrl

+0

제품의 데이터베이스 레코드를 정말로 업데이트 할 지 모르겠습니다. 제품 기록을 유지해야하는 경우 교체하는 것이 더 적절할 수 있습니다. – grover

1

독점/비관주의 또는 optimistic이라는 간단한 잠금을 수행 할 수없는 높은 동시성 또는 성능 요구 사항이 있습니까?