2013-08-14 3 views
1

MVC3에서 도청하고 있으며, SQL Server에 연결하는 사이트를 구성하고 있습니다 (별로 놀랍지 않습니다.). 다른 비즈니스 개체에 대한 다양한 다른 저장소 클래스에 의해 확장 될 SqlRepository라는 기본 클래스를 사용하고 있습니다. 기본 클래스는 요청의 수명 동안 다른 모든 인스턴스간에 공유 될 데이터베이스 연결 열기를 처리합니다 (즉, 싱글 톤).요청이 완료되면 데이터베이스 연결을 정리하십시오.

public abstract class SqlRepository { 
    protected SqlConnection dbconn; 

    public SqlRepository() { 
     if (HttpContext.Current.Items["dbconn"] == null) { 
      dbconn = new SqlConnection(WebConfigurationManager.ConnectionStrings["SqlRepositoryConnection"].ConnectionString); 
      dbconn.Open(); 
      HttpContext.Current.Items["dbconn"] = dbconn; 
     } else { 
      dbconn = (SqlConnection)HttpContext.Current.Items["dbconn"]; 
     } 
    } 
} 

하위 클래스는 다양한 저장소 유형에 대한 다양한 인터페이스를 구현하며 Ninject를 통해 주입됩니다.

그렇다면 각 요청주기가 끝날 때 데이터베이스 연결이 닫히는 것을 확인하는 좋은 방법은 무엇입니까? 추가 종속성없이 컨트롤러에서 명시 적으로 연결을 닫을 필요없이 (다른 더미 리포지토리에 대해 다른 빌드 구성을 사용하고 SQL 기반 서버를 사용하지 않을 수도 있기 때문에)이 작업을 수행하고 싶습니다. 프런트 엔드를 개발/디버깅하는 동안).

나는 간단한 해결책이있을 것이라고 생각하지만, 아직 MVC3을 사용하여 어디에서 처리해야하는지 알지 못했습니다.

답변

2

컨트롤러 또는 컨트롤러 기본 클래스에서 수행하지 않으려면 Global.asax에서 수행하십시오. MVC 방식이 아니라 MVC를 사용한다고해서 모든 것이 순수 MVC 여야한다는 것은 아닙니다. 이러한 이벤트는 여전히 정상적으로 작동합니다.

private void Application_EndRequest(object sender, EventArgs e) 
{ 
    var conn = HttpContext.Current.Items["dbconn"]; 
    if (conn != null) 
    { 
     conn.Close(); 
    } 
} 
+0

나는 그것을 좋아합니다. SqlRepository 개체에 Application_EndRequest에 대한 이벤트 처리기를 등록 할 방법이 있습니까? 아니면 Global.asax에 모두 넣어야합니까? – db2

+0

@ db2, 네, 답을 업데이트했습니다 –

+0

우, 완벽 할 것입니다. 감사. 나는 HttpContext를 파고들 필요가 있다는 의심을 가지고 있었지만, 내가 무엇을 찾았는지 알 수 없었다. – db2

관련 문제