2012-02-16 5 views
1

간단한 양식의 3 계층 웹 응용 프로그램이 있습니다. 하나는 레코드를 나열하고 하나는 단일 레코드를 편집하는 것입니다.3 계층 응용 프로그램에서 Entity Framework의 ObjectContext를 어디에서 인스턴스화해야합니까?

내 EDMX가있는 DataLayer가 있습니다. 내 POCO가있는 App Layer가 있습니다. MVC가 아닌 모든 컨트롤러 클래스로 BusinessLayer를 볼 수 있습니다. 웹 UI가있는 UI 레이어가 있습니다.

EDMX에는 탐색 속성이 많이 포함 된 많은 테이블이 있습니다. 물론 컨트롤러 중 하나에서 데이터를 가져올 때. GetCustomerById (int id), Object Context를 생성하고 끝나면 닫는다.

그러나 UI 레이어의 탐색 속성에 액세스하려고 시도하면 ObjectContext이 범위를 벗어납니다.

웹 레이어에서 (using MyContext = new MyContext()) {... }해야합니까 ?? 그건 옳지 않은 것 같아. BizLayer의 엔티티 데이터로 채울 수있는 또 다른 POCO 집합을 만들어야합니까? 웹 양식에 입력 된 데이터를 저장하려면 어떻게됩니까? 예 : BizLayer 컨트롤러를 호출할까요? SaveCustomer()?

내 질문은 엔티티의 탐색 속성에 제대로 액세스 할 수 있도록하려면 어떻게 웹 UI 레이어를 디자인해야합니까?

참고 : EDMX는 LazyLoading으로 설정됩니다.

+0

OMG이 질문은 몇 번이고 다시 온다 ... :) 내 asnwer 여기를 참조하십시오, 궁극적 인 진리 또는 갈 유일한 방법이 아니지만 지금까지 많은 합의가 있어요 ... http://stackoverflow.com/a/7474357/559144 –

+0

감사합니다. 하지만 이것은 MVC가 아닙니다. 나에 대한 질문은 웹 UI에서 EF에 대한 의존성을 원하지 않는다면 POCO를 어떻게 처리하고 어떻게 올바르게 액세스/저장/편집 할 수 있는지에 관한 것입니다. – John

+0

그게 내 대답에 설명되어 있습니다, 그것은 또한 웹 양식이나 Windows 양식 또는 WPF, 당신이 EF, NHibernate 등 모든 종속성에서 UI를 분리 레이어링에 적용 ... –

답변

1

UI에서 지연로드를 사용하려고하지만 사용자 인터페이스가 사용자의 ObjectContext의 수명을 정의한다는 의미입니다. 컨텍스트를 UI에 표시하지 않고도이를 수행 할 수있는 방법은 여러 가지가 있습니다. 예를 들어 다음과 같은 간단한 접근 방식을 사용할 수 있습니다.

  1. 컨텍스트를 사용하는 컨트롤러를 언급하고이를 폐기합니다. 따라서 컨트롤러를 일회용으로 만들고 모든 방법에서 컨텍스트를 폐기하는 대신 컨트롤러의 전체 수명 동안 단일 컨텍스트를 사용하십시오. 제어기의 Dispose 메소드에서 문맥을 삭제하십시오.
  2. 요청에 따라 컨트롤러를 인스턴스화하십시오. 예를 들어 컨트롤러의 인스턴스를 Page.Load에 만들고 Page.Unload에 처리 할 수 ​​있습니다.
  3. 컨트롤러 및 엔티티를 원하는대로 사용하십시오. 요청의 전체 처리 (LoadUnload 사이)는 단일 생활 환경의 범위에 포함됩니다.

어쨌든 웹 응용 프로그램에서 너무 느리게로드하지 않아도됩니다. 귀하의 양식에서 귀하는 필요한 엔티티가 무엇인지 정확하게 알기 때문에 열정적 인로드로 직접 요청해야합니다.