2009-09-02 4 views
1

Autofac 초보자는 여기 있습니다. 그러나 지금까지 내가 본 것을 좋아합니다. 내 해결 된 객체의 요청 수명을 활용하려고하는데 요청이 처리 된 후 실제로 처리가 진행되고 있음을 확인하는 데 문제가 있습니다.autofac, ASP.NET 통합 및 Dispose

나는 페이지 요청을 시작할 때 끝내 버리는 처분 할 수있는 객체를 가지고있다. autofac을 사용하여 객체의 인스턴스를 얻었습니다. autofac이 저에게 처리를 수행하는지 확인하고 싶었습니다.

나는 문제의 객체에 Dispose() 메소드를 설치했으며, 페이지가 평생 관리를 수행 할 때 '불'으로 볼 수 있습니다. 나는 스스로를 처분하지 않고 autofac이 그것을하도록 내버려 두지 않는다.

web.config 및 global.asax 변경 사항을 포함하여 these 명령어를 사용하여 구성을 조정했습니다. 객체를 인스턴스화 할 수는 있지만 실제로 처리되는지는 알 수 없습니다. 다른 단계가 있습니까?

답변

1

나는 그것을 알아 냈다!

오브젝트 인스턴스에 대해 WRONG 컨테이너에 요청했습니다. 어플리케이션 컨테이너에 요청 컨테이너가 아니라 오브젝트를 요청했습니다.

D' oh!

+1

그래,이 문제는 대개 알아내는 것이 좋습니다. 나는 보통 서비스 위치 지정 기능 대신 DI 기능을 많이 사용하므로이 문제에 부딪치지 않습니다. 한 번은 nhibernate의 Session이 잠겨있어서 내 개발 데이터베이스를 잠궈 놓았습니다 ... 많은 재미가있었습니다. – Min

0

처분은 "처분"방법을 정의 할 수있는 인터페이스입니다. 일회용 클래스를 요구하는 가장 일반적인 용도는 클래스에 명시 적으로 해제해야하는 리소스 (예 : Windows 리소스 핸들)가있는 경우입니다. 대부분의 경우 IDisposable 인터페이스는 필요하지 않습니다. 가비지 컬렉터는 매우 강력하며 메모리 관리에서 훨씬 더 효율적입니다. 그러나 분명히 핸들을 즉시 해제해야하는 경우가 많아서 다음 단계 인 IDisposable 구현으로 넘어갑니다.

하지 말아야 할 것 :

var myClass = MyDisposableClass(); 

// do stuff with myClass 

myClass.Dispose(); 


Proper usage: 

using (var myClass = MyDisposableClass()) 
{ 
    // do stuff with myClass 
} 

컴파일러는 효과적으로 다음과 같은를 구축 할 것입니다 :

MyDisposableClass myClass = MyDisposableClass(); 
try 
{ 
    // do stuff with myClass 
} 
finally 
{ 
    myClass.Dispose(); 
} 

무슨 상관없이, 당신은 당신의 폐기 얻을 것이다 알고있는 중요한 구별 라는. 또한 소멸자 (존재하는 경우 가비지 콜렉터에 의해 호출 됨)를 묶어서 연결하여 Dispose 메소드를 호출 할 수 있습니다. 그러나 어떤 이유로 든 동일한 자원을 두 번 풀어주지 말아야 할 경우 (해제 후 포인터를 null로 설정하십시오).

+0

시간을내어 주셔서 감사합니다. 나는 어떻게 일을 처리하는지 안다. 내 목표는 페이지가 일회용인지 여부를 알 필요없이 구현을 교환 할 수있게하는 것이 었습니다. Autofac의 서브 컨테이너 수명주기 관리는 그렇게하기로되어 있으며, ASP.NET 통합은 요청 수명 동안 관리합니다. 나는 그것이 실제로 일어나고 있음을 확인하기를 원했다. – n8wrl

1

페이지 내에서 수동으로 개체를 배치하거나 Autofac 모듈이 수행하도록할지 여부에 관계없이 요청 수명주기와 관련하여 개체가 배치 될 때 차이가 발생합니다. The Autofac ContainerDisposalModuledispose the Request container이 아니며 HttpApplication.EndRequest가 시작될 때까지 요청 수명주기의 끝에 있습니다.

오브젝트 Dispose 메소드에 대한 호출을 추적하는 방법에 따라 출력이 표시되지 않을 수도 있습니다. Dispose 메서드를 어떻게 계측하고 있습니까? 재 포스트에서 답변

+0

좋은 질문입니다, 피터 - 나는 세 가지를 시도했습니다. 처음 두 개는 아무 것도 보여주지 않았습니다 - response.write와 httpcontext.trace 모두 타이밍에 의해 설명 될 수 있습니다. 그러나 세 번째는 이벤트 로그 작성으로 아무것도 표시하지 않습니다. – n8wrl

+0

동의합니다. 이벤트 로그로의 추적은 요청 수명주기의 영향을받지 않아야합니다. 흠. –

1

반복 :이 (어떤 IoC 컨테이너에서) 일어나는 대부분의 시간

당신이 종속의 사슬을 따라 구성 요소가 싱글 것을 확인할 수 있습니다.

예.

A -> B -> C A는 다음 싱글 B에 대한 참조를 얻을 것이다 해결 '공장', B '는 싱글' 이고 C '는 팩토리이다이면

어느 항상 새로운 C의 순서에서 같은 C.

를 참조합니다 당신이 해결마다 생성 얻을, B는 '공장'이어야합니다.