2012-06-24 4 views
1

ASP.NET MVC 4 응용 프로그램에서 Spring.NET의 IOC 컨테이너를 사용하고 있습니다. 각 컨트롤러는 컨테이너에서 EF의 데이터 컨텍스트를 얻고있다 : 나는 컨트롤러를 스캐 폴딩 한Spring.NET IOC/MVC - 삭제 된 데이터베이스 컨텍스트

private readonly IDBContext db = 
     (IDBContext) ApplicationHelper.ApplicationContext.GetObject("DatabaseContext"); 

, 기본적으로 그들은 DB 연결이 배치되는으로 IDisposable 인터페이스를 구현 - 같은 :

protected override void Dispose(bool disposing) 
    { 
     this.db.Dispose(); 
     base.Dispose(disposing); 
    } 

괜찮습니다. 저는 그렇게하고 싶습니다. 그러나 호출 된 두 번째 컨트롤러는 데이터베이스 컨텍스트가 삭제되었음을 알리는 예외를 제공합니다.

그래서 다음 컨트롤러가 GetObject() 메서드를 호출 할 때 개체가 삭제되었는지 IOC 컨테이너 검사를 수행하고 싶습니다. 그럴 수 있습니까, 아니면 디자인을 변경해야합니까?

답변

1

기본적으로 spring.net 웹 응용 프로그램 컨테이너에 구성된 객체는 "application" scope입니다. 즉, DatabaseContext이라는 인스턴스가 웹 응용 프로그램 시작시 한 번 만들어집니다. 이 인스턴스를 사용하는 첫 번째 컨트롤러가 처리 한 후 다른 컨트롤러에서 사용할 수 없습니다.

일반적으로 IOC 컨테이너를 사용할 때는 dispose 구현을 사용하여 컨트롤러에서 수행하는 것처럼 객체 수명을 직접 관리하는 것이 좋습니다. 가능한 경우 컨테이너가 객체 수명을 관리하도록해야합니다.

이 경우에는 request 범위를 사용하여 DatabaseContext을 만드는 것이 좋습니다. 그렇게하면 스프링 컨테이너가 귀하의 요청이 끝날 때 DatabaseContext을 처분합니다. 이 때 을 Controller.Dispose에서 제거 할 수 있습니다.

최근에 질문이 IoC (spring.net) with asp.net - ctor injected non-singleton objects on controller - where do I dispose?과 함께 나타납니다. 그것은 당신에게도 흥미있을 것입니다.

+0

대답 - 달콤한 자리. 감사! 나는 scope = "request"를 추가했고 모든 scaffolded dispose 코드를 제거 할 것이고 작동한다! –

0

IoC 컨테이너 설정 방법과 비슷하게 IDBContext을 싱글 톤으로 구성했습니다.

인스턴스 기반 IDBContext으로 변경하십시오.

관련 문제