2011-01-31 2 views
5

솔직히 저는 C#과 Asp.net MVC 모두에서 초보자입니다. asp.net 웹 응용 프로그램이 실제로 IIS 및 ASP.NET 프레임 워크에서 작동하는지도 모르겠습니다.컨트롤러 클래스의 DbContext 인스턴스 필드 대 Global.asax의 DbContext 정적 필드?

내 asp.net mvc 응용 프로그램에서 DbContext (또는 DbContext에서 파생 된 모든 클래스) 필드를 선언해야하는 결정에 혼란 스럽습니다.

  1. 모든 컨트롤러가 사용을 할 수 있도록 global.asax 내부 정적 필드로 필드를 선언 :

    나는 두 가지 선택이있다.

  2. 필드를 각 컨트롤러 클래스 내부의 인스턴스 필드로 선언하십시오.

어떤 것이 올바른지 설명해 주시겠습니까? 더 자세한 설명이 필요합니다.

답변

8

global.asax에서 정적 필드로 만들면 동시성 문제가 발생합니다. 여러 요청의 여러 스레드가 들어 와서 서로의 데이터를 가져올 수 있습니다. 더 나쁜 것은 웹 사이트에서 더 많은 트래픽을 얻기 시작할 때까지 또는로드 테스트를 시작할 때까지 표시되지 않는다는 것입니다. 싱글 톤으로 구현하면 모든 것이 테스트에서 잘 작동 할 것이며 "나는 천재예요!이 구현이 얼마나 깨끗한 지보세요!"라고 생각할 것입니다. 그러나 언젠가는, 내가 한 것처럼 너는 이것으로 불에 타게 될 것이다. 결과가 겹쳐서 사용자가 속한 데이터를보기 시작하고 웹 사이트가 예기치 않게 작동합니다.

Entity Framework 및 LINQ to SQL의 컨텍스트 클래스는 실행하려는 각 쿼리 집합에 대해 설정 한 간단한 인스턴스로 설계되었습니다. 오래 살아야한다는 의미는 아닙니다. 나는 전체 응용 프로그램 (DbContext에서 파생 된 또는 클래스) DbContext의 단일 인스턴스를 사용합니다 경우

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

두 번째 옵션을 선택해야합니다. 즉 선언하고 컨트롤러에서 사용하십시오. DBContext를 global.asax에 정적 필드로두면 기본적으로 전체 응용 프로그램의 단일 인스턴스가됩니다.

반면에 두 번째 옵션을 사용하면 각 요청에 대해 DBcontext를 사용할 수 있습니다. 종속성 주입을 사용하여 각 동작 메서드에서 DBContext를 얻을 수 있다면 더 좋을 것입니다.

+0

는 단점이 무엇인가? – LaTeX

+2

@Stack Overflow - 데이터베이스 연결면에서 "싱글 톤"을 읽고 왜 악의가 있는지. – RPM1984