NHibernate 세션 위에 작업 단위 패턴을 사용하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/980584

  •  13-09-2019
  •  | 
  •  

문제

NHibernate가 이미 제공 한 것 외에 UOW 구현을 언제 작성합니까? 실제 세계 사례가 있습니까?

도움이 되었습니까?

해결책

당신이 설명하는 작업 단위는 이미 nhibernate에 의해 제공되므로 그러한 작업 단위를 할 이유가 없습니다.

WCF 서비스에있는 것은 현재 작업 단위에 대한 응용 프로그램에 중요한 정보를 포함하는 더 높은 수준의 작업 단위입니다. 여기에는 우리를위한 nhibernate issession을 추상화하는 것이 포함됩니다. 분류하면 세 가지 범주에 맞는 코드가 있습니다.

  1. 작업 단위를 처리 해야하는 코드. 누가 작업 단위를 뒷받침하는지는 중요하지 않습니다. nhibernate, ibatis 또는 custom orm 일 수 있습니다. 코드가 필요한 모든 코드는로드, 롤백, 저장 등입니다.

  2. 특정 작업을 수행하기 때문에 직접적으로 직접 처리 해야하는 코드. 일반적으로 이것은 생성 해야하는 복잡한 쿼리와 관련이 있습니다.

  3. 작업 단위에서 실행 중이거나 ISESSION에 접근하고 있음을 알 필요는 없습니다. 우리는이 토론의 일부로 이것을 완전히 무시할 수 있습니다.

1의 코드는 단지 issession에 대해 작동 할 수 있지만, 우리의 선호는 우리가 직접 제어하지 않거나 변경 될 수있는 코드의 물건을 추상화하려고 시도하는 것입니다. 이것은 두 가지 이유로 가치가 있습니다.

  • 우리가 시작했을 때 우리는 nhibernate에서 100% 팔리지 않았습니다. 우리는 Ibatis 또는 관습을 고려하고있었습니다. 분명히 이것은 더 이상 문제가 아닙니다.

  • 전체 팀은 Nhibernate의 전문가가 아니며 우리가 원하지 않기를 원하지 않습니다. 대부분의 경우 사람들은 카테고리 1에 맞는 코드를 작성합니다. 그리고 그들이 아는 것은 우리의 작업 단위입니다. 카테고리 2의 코드가 서면을 작성해야 할 때 Nhibernate를 잘 이해하는 팀의 사람들이 작성해야합니다.

따라서 문을 닫기 위해 나는 당신이 말하는 작업 단위 유형이 필요하지 않다고 말할 것입니다. 더 높은 수준의 작업 단위가 많은 가치를 제공 할 수 있다고 제안합니다.

다른 팁

내 기본 작업 단위 인터페이스에는 다음 방법이 포함되어 있습니다 - 초기화 - 커밋 - 롤백 - idisposable.dispose

세션 및 거래 관리에 사용합니다. 다른 세션 스코프에 대해 그 코드를 반복해서 쓸 필요가 없기 때문에 유용합니다. (요청 당 작업 단위, 일련의 요청 당, 스레드 당 등)

모든 매핑을 올바르게 설정하면 (즉, 캐스케이드) 특별한 일을 할 필요가 없으며 ISession 잘 할 것입니다. 그러나 3 계층 응용 프로그램을 작성하는 경우 단일 트랜잭션에서 수행하려는 데이터베이스 작업을 수동으로 시퀀싱해야합니다. 엔터프라이즈 애플리케이션 아키텍처의 "패턴"에서 Fowler의 "참조 구현" "은 좋은 출발점이 될 수 있습니다.

class UnitOfWork... 

   public void registerNew(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      Assert.isTrue("object not already registered new", !newObjects.contains(obj));
      newObjects.add(obj);
   }
   public void registerDirty(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
         dirtyObjects.add(obj);
      }
   }
   public void registerRemoved(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      if (newObjects.remove(obj)) return;
      dirtyObjects.remove(obj);
      if (!removedObjects.contains(obj)) {
         removedObjects.add(obj);
      }
   }
   public void registerClean(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top