Di And Idisposable
DI 와 IDisposable
Dependency Injection 을 수행하는 Ioc Container 는 IDisposable
을 상속받은 객체를 생성하는 경우 그 객체의 생성과 소멸을 관리한다. 이 작업은 Ioc Container Interface 이기도 한 Scope 생성을 통해서 이루어진다.
Scope 를 만들지 않으면 프로그램이 종료 시 Dispose()
가 호출될 수도 있고 아닐 수도 있다. 예를들어 .Net 에서 제공하는 Microsoft.Extensions.Host
의 IHost
에서 Dispose()
를 호출하는 경우 관리되는 모든 객체들의 Dispose()
가 호출된다. 또는 기본 Scope 를 미리 만들어 프로그램이 종료될 때 Dispose()
를 수행할 수도 있다. 구현하기 나름이다.
주의할 점은 Ioc Container 에서 Dispose 되지 않는 객체는 Ioc 내부적으로 참조되어 GC 되지 않는다는 것이다.
Scope 를 사용하지 않는다면?
새로운 윈도우를 만든다거나 팝업을 띄운다던가 그런 경우 다른 방법보다 Scope 를 사용하는 것이 현명할 수가 있다.
아래는 내가 해본 삽질이다.
Prism IDestructible
Prism 의 IDestructible
은 Navigation Stack 에서 벗어날 때 Destroy()
를 호출해 Dispose()
와 유사하게 관리되는 리소스를 해제하도록 한다.1
문제는 Navigation Stack 을 직접 제어할 일이 적을 뿐더러, 단순히 DI 를 통해 ViewModel Binding 을 수행하는 경우 등에는 적용이 되지 않는다는 것이다.
WPF Unloaded
Unloaded
같은 이벤트에서 직접 Dispose()
를 구독시키면 어떨까 생각할 수도 있다.
하지만 TabControl
등에서 여러번 호출될 가능성이 있기 때문에 적절하지 못하다. LogicalTreeHelper.GetParent()
를 사용하는 경우 일부는 해결이 되지만, 해당되는 Control 이 여러 Layer 로 감싸여 있다면 적용할 수 없다.2
댓글남기기