2012-04-25 2 views
2

У меня есть класс Foo, который используется для настройки контейнера и функционирует как фабрика для другого класса, Bar, который используется как точка входа для службы Windows.Autofac OnRelease() не называется

В класс Bar вводится экземпляр Baz, который открывает соединение сокета.

В Foo IBaz сконфигурирован с OnActivated(), чтобы открыть соединение, и OnRelease(), чтобы закрыть соединение.

Приемочный тест использует Foo для создания бара и проверки некоторых ожидаемых результатов. Проблема в том, что тест никогда не завершается, потому что соединение Baz никогда не закрывается. Это связано с тем, что OnRelease() никогда не вызывается.

Мое понимание заключается в том, что как только Foo выходит из сферы действия и собирается мусор, контейнер должен вызывать делегат OnRelease().

Почему это не может случиться?

ответ

2

Для управления выпуском компонентов вам необходимо использовать весь срок службы. Управление жизненным циклом в Autofac всегда явственно и не полагается на GC.

В этом случае это может быть сам контейнер, который играет эту роль. Утилизация контейнера вызовет вызовы OnRelease. Он немного длинный, но this охватывает детали.

+0

Я просто наткнулся на это. Я не помню подробностей сейчас, но я думаю, что OnRelease() не вызывалось, потому что сокет сохранял объект в живых. –

Смежные вопросы