2011-09-17 3 views
0

저는 unitOfWork 패턴으로 구현 된 리포지토리를 가지며 컨텍스트를 공유합니다. 나는이 저장소들 위에 서비스 계층을 가지고있다. 에는 여러 서비스가 있습니다. 서비스 클래스를 인스턴스화 할 때 - unitOfWork 인스턴스가 생성됩니다.리포지토리 및 작업 단위 패턴의 컨텍스트 수명 관리

그러나 이러한 서비스 메소드는 서로를 호출하고 때로는 공통 세션 객체에서 작동하는 경우가 많습니다.

엔티티 객체가 IEntityChangeTracker의 여러 인스턴스에서 참조 할 수 없습니다 - 어떤 동일한 개체의 문제를 일으키는보다 구체적 여러 상황 또는 추적중인.

은 어떻게 상황 관리 유지 너희들은 다음과 같습니다이 같은

아무것도 - http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management

또는

나는 또한 사람들이 자신의 상황을두고 HttpContext를 및 사용하는 것을 읽고

http 호출 당/사용자 당?

가장 좋은 방법은 무엇입니까?

답변

2

일반적인 접근 방식은 Http 요청 당 단일 컨텍스트를 사용하는 것입니다. 단일 요청 처리 내의 서비스가 서로 호출하면 단일 작업 단위로 작동하기 때문에이 컨텍스트는 서비스간에 공유됩니다. 단일 작업 단위로 작동하지 않으면 각 작업 단위마다 새로운 컨텍스트가 필요할 수 있습니다.

세션에 저장된 객체의 두 번째 문제점은 컨텍스트를 인스턴스화하는 것과 관련이 없습니다. 컨텍스트에서 분리하지 않고 프록시 된 엔터티를 세션에 저장했다는 사실과 관련이 있습니다. 이 문제를 해결하려면 다음 중 하나를 수행해야합니다.

  • 엔티티를로드하는 데 사용 된 컨텍스트를 삭제하기 전에 세션에 저장된 엔티티를 분리합니다 (또는 엔티티가 지속성 중에 첨부 된 경우). 이것은 당신의 대답을 context.Configuration.ProxyCreationEnabled = false
+0

감사를 사용하여 context.Entry(entity).State = EntityState.Detached 세션에 저장된 개체에 대한 프록시 생성을 끄고

  • 하여 수행 할 수 있습니다에 요청 개체 당 저장할 수있는 가장 좋은 장소는 무엇입니까? 요청 개체 사전이 있습니까? – MoXplod

  • +0

    'HttpContext.Current'는 요청 항목마다 저장하는 데 사용됩니다. –

    관련 문제