Мой конкретный контекст - это самодостаточное приложение Nancy, в котором я использую встроенную базу данных документов RavenDb.NancyFx - Как удалить экземпляры, зарегистрированные как singleton в контейнере приложений?
Мой самозагрузки выглядит следующим образом:
public class MyBootstrapper : DefaultNancyBootstrapper
{
protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
base.ConfigureApplicationContainer(container);
container.Register<IDocumentStore>(CreateDefaultStore());
container.Register<IDoSomething, MyOtherType>().AsSingleton(); // implements IDisposable
}
private static IDocumentStore CreateDefaultStore(){...}
}
Проблема заключается в том, что я ожидал, что Dispose метод IDocumentStore и моего пользовательского одноразового типа, который будет вызываться, когда NanyHost остановлен.
NancyHost реализует IDisposable, TinyIoCContainer реализует IDisposable, если я зарегистрирую тип, который реализует IDisposable в контейнер запроса, он будет удален. Я был почти уверен, что при размещении Хоста контейнер будет удален и все зарегистрированные экземпляры будут удалены.
Я знаю, что я могу хранить ссылку на хранилище документов вне загрузчика и утилизировать его после того, как хозяин останавливается, и я могу думать о некоторых других уловках, как имеющий bootstraper реализовать IDisposable и утилизировать его вручную после того, как хозяин но я был уверен, что существует более автоматический способ обработки всех зарегистрированных случаев.
Я пропустил какой-то умный способ вызова Dispose() для экземпляров singleton, зарегистрированных в контейнере приложения?
Мое предположение заключается в том, что, поскольку ожидается, что контейнер приложения & будет работать до тех пор, пока приложение не закончится, утилизация контейнера не была приоритетом, но все же это кажется плохой практикой, если это так.
UPDATE: После отправки сообщения, i'I've нашел this thread on the nancy group, который имеет некоторую информацию, связанную с этим, но староват.
Singleton созданы для того, чтобы жить до тех пор, пока не прекратятся приложения, так почему вы хотите избавиться от чего-то, что невозможно? – VeNoMiS
Я предполагаю, что существуют сильные причины, по которым одиночные игры выполняют очистку при завершении работы приложения. (очистка, освобождение неуправляемых ресурсов и т. д.) –
@IulianMargarintescu - вы никогда не ставили неуправляемые ресурсы в статическом экземпляре, чтобы начать с ... Хранилище документов не является неуправляемым ресурсом. Если его не утилизировать должным образом, это не имеет значения. – Phill