2017-05-14 1 views
1

Simpl eInjector 문서는 일시적 등록 및 단일 등록에 대해 명확하며 처리 방법 등을 설명합니다. 문서에서는 사전 구성된 개체를 제외한 모든 개체에 등록 된 개체가 컨테이너 처리됩니다.Simple Injector ASP.NET Singleton Dispose

내 질문에는 특히 ASP.NET 응용 프로그램이 삭제 될 때 처리해야하는 싱글 톤 등록이 관련되어 있습니다 (해당 서비스가 폐기 될 때 나머지 메시지를 보냅니다). 대부분의 등록은 일시적이며 각 요청이 처리 될 때 처리됩니다. VS/IISExpress에서 디버깅 할 때, 내 싱글 톤이 처리되는 시점을 보지 못했습니다. 컨테이너 자체가 결국 폐기 될 때도 보지 못합니다. 내 콘솔 애플 리케이션에서 & 하늘빛 서비스 나는 내가 끝나면 단순히 container.Dispose()를 호출합니다. 이 최종 정리를위한 ASP.NET의 모든 단서?

답변

2

싱글 톤을 처리하려면 응용 프로그램이 끝날 때 명시 적으로 Container.Dispose()을 호출해야합니다. 예를 들어 Global.asax의 Application_End 이벤트에서이 작업을 수행 할 수 있습니다. 그러나 경고하십시오. 해당 서비스는 이것은 아주 나쁜 생각입니다

배치 될 때 Application_End 이벤트가 실행되지 않습니다 많은 이유가 있기 때문에

나는, 남아있는 메시지를 보냅니다. IIS는 응용 프로그램을 공격적으로 중단시킬 수 있으므로 정전 및 기타 하드웨어 오작동이 발생합니다. 이 경우 로컬 버퍼에 남아있는 모든 메시지가 손실됩니다.

응용 프로그램 하트 비트 및 로깅에 사용되는 일시적인 메시지에는 문제가되지 않을 수 있지만 이러한 메시지가 중요한 비즈니스 이벤트를 설명하는 경우 내구성 큐 또는 저장 메커니즘을 사용해야합니다.

VS/IISExpress에서 디버깅, 나는 지금 내 싱글이 아주 잘 할 수있다 배치

를 얻을 때 표시되지 않습니다. 웹 응용 프로그램을 디버깅 할 때 웹 응용 프로그램 자체가 멈추지 않습니다. 디버깅을 중지하는 경우, 파이널 라이저 및 클린업 메소드를 실행할 기회없이 응용 프로그램이 갑자기 중지되거나 디버깅을 중지하면 응용 프로그램이 백그라운드에서 계속 실행됩니다. 여전히 어떤 정리 작업도 보지 못할 것입니다.

+0

나는 그런 접근 방식의 문제점에 대해 완전히 동의하지만, 대부분의 경우 아무것도하지 않는 것 (즉, 보내지 않은 메시지를 버리는 것)보다 낫습니다. 중복 접근 방식을 사용하더라도 안전하지는 않습니다. 내가 요구하는 것은 호스팅 된 IIS ASP.NET 환경에서 SimpleInjector 컨테이너가 삭제되도록 올바른 방법이 무엇인지 묻기 때문에 적어도 로컬에 대기중인 모든 메시지를 보내고 시도 할 기회가 있습니다. OWIN OnAppDisposing Application_End 해당하는 있습니까? – pseabury

+1

메시지를 잃어 버리는 것이 문제가된다면 디자인을 바꾸는 것이 좋습니다. 나머지 요청 실행과 동일한 데이터베이스 트랜잭션에서 해당 메시지를 유지하십시오. 이는 메시지 손실을 막는 매우 일반적인 접근 방식입니다. OWIN 소개 : OnAppDisposing이 무엇인지 잘 모르겠습니다. 문서를 읽고이를 테스트해야합니다. – Steven

+0

특정 메시지가 어떻게 w.r.t에서 이루어 졌는지 다시 한번 살펴 보겠습니다. 데이터 트랜잭션 IIRC에서 Azure ServiceBus (우리가 사용하는 것)에 메시지를 작성하는 것은 주변 DB 트랜잭션 범위 외부에서 수행되어야합니다. https://docs.particular.net/nservicebus/azure-service-bus/understanding-transactions-and-delivery-guarantees?version=asb_6을 참조하십시오. 토론 Steven에게 감사드립니다! – pseabury

관련 문제