2009-07-01 9 views
1

현재 ASP.Net에 대해서는 요청 당 컨텍스트가 만들어지고 (필요한 경우에만) 요청 모델을 사용하고 끝 부분에 처리되는 요청 모델을 사용합니다. 그 요청. 나는 이것을 쿼리 모델마다 오래된 사용법을 사용하지 않고 영원히 컨텍스트를 가지지 않는 것 사이에 좋은 균형이 있다는 것을 알았다. 이제 문제는 WPF에서 요청 모델처럼 사용할 수있는 것이 무엇인지 모릅니다. 바로 지금 같은 컨텍스트를 영원히 (악몽이 ​​될 수 있음) 유지하거나 성가신 쿼리 모델로 돌아가는 것 같습니다. 엄청난 고통입니다. 나는 아직 이것에 대해 좋은 대답을 보지 못했다.엔티티 프레임 워크 : WPF 대 ASP.Net 컨텍스트 ... 처리 방법

내 첫 번째 생각은 최상위 메소드 (Something_Click과 같은 이벤트 처리 메소드라고 부름)가 컨텍스트를 열고 "끝내십시오"라는 "열기 및 닫기"(또는 다른 이름) 상황을 갖는 것입니다. . 컨텍스트를 인식하는 UI 프로젝트에는 아무 것도 없으므로 (모든 쿼리는 생성 된 엔터티 클래스를 효율적으로 확장하여 엔터티와 UI 사이에 의사 계층을 생성하는 부분 클래스의 메서드에 포함되어 있습니다. 엔티티 레이어가 UI 레이어에 종속되도록 만듭니다.

정말 상태 프로그래밍에 익숙하지 않으므로 실제로는 손실이 있습니다.

추가 :

내가 사용 스레드에서 읽었지만이 상황은 단지 주위에 앉아있는 문제는 오류 및 복구입니다.

사용자에게 정보를 업데이트하는 양식이 있는데 오류가 있습니다. 사용자 양식은 이라는 변경 내용을 컨텍스트의 사용자 개체에 표시합니다. 사용자 경험을 통해 더 이상 의 모든 변경 사항을 다시 입력 할 필요가 없어졌습니다.

사용자가 다른 양식으로 이동하기로 결정한 경우 어떻게됩니까? 이러한 변경 사항은 여전히 ​​ 입니다. 이 시점에서 나는 틀린 사용자 과 함께 컨텍스트 내에서 객체 을 붙이거나 컨텍스트를 알리는 UI를 가져와 을 재설정해야합니다. 나는 그것이 끔찍한 (사용자에게 클래스의 재 장전 방법이 아닌가?)라고 생각하지만, 이 실제로이 문제를 해결하는지 모르겠다.

답변

0

작업 단위를 사용해 보셨습니까? 내 EF 컨텍스트를 노출하지 않고 컨텍스트를 열고 닫을 수 있어야하는 것과 비슷한 문제가 발생했습니다. 우리는 다른 아키텍처 (IoC 컨테이너와 저장소 계층을 사용하고 있습니다)를 사용하고 있다고 생각합니다. 따라서이 코드를 자르면 조금만 자르려고합니다. 나는 그것이 도움이되기를 바랍니다.

는 그 "Something_Click"방법에 관해서

먼저, 나는 같은 것을 보았다 코드 거라고 : 내 저장소의 각에서

using (var unitOfWork = container.Resolve<IUnitOfWork>){ 

    // do a bunch of stuff to multiple repositories, 
    // all which will share the same context from the unit of work 

    if (isError == false)  
     unitOfWork.Commit(); 
} 

을, 나는이었다 있는지 확인해야 할 것 한 작업 단위로 만약 내가 그렇다면, 나는 작업 단위의 문맥을 사용할 것이다. 그렇지 않다면 내 자신의 상황을 인스턴스화해야합니다. 따라서 각 저장소에는 다음과 같은 코드가 있습니다.

if (UnitOfWork.Current != null) 
{ 
    return UnitOfWork.Current.ObjectContext; 
} 
else 
{ 
    return container.Resolve<Entities>(); 
} 

그러면 UnitOfWork는 어떻게됩니까? 그다지 거기에 없다. 나는 주석과 코드를 잘라야 만 했으므로이 클래스를 완전히 작동시키는 것으로 생각하지 말고 ...여기에 당신이 간다 :

public class UnitOfWork : IUnitOfWork 
{ 
    private static LocalDataStoreSlot slot = Thread.AllocateNamedDataSlot("UnitOfWork"); 
    private Entities entities; 

    public UnitOfWork(Entities entities) 
    { 
     this.entities = entities; 
     Thread.SetData(slot, this); 
    } 

    public Entities ObjectContext 
    { 
     get 
     { 
      return this.Entities; 
     } 
    } 

    public static IUnitOfWork Current 
    { 
     get { return (UnitOfWork)Thread.GetData(slot); } 
    } 

    public void Commit() 
    { 
     this.Entities.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     entities.Dispose(); 
     Thread.SetData(slot, null); 
    } 
} 

당신의 솔루션에 이것을 고려하면 약간의 작업이 필요할 수 있지만, 이것은 옵션 일 수 있습니다.

관련 문제