Как освободить объекты HybridHttpOrThreadLocalScoped в StructureMap? - PullRequest
9 голосов
/ 21 июня 2011

При выполнении фоновых задач в службе Windows я использовал HybridHttpOrThreadLocalScoped для хранения экземпляров NHibernate ISessions.

Поскольку в Windows Server отсутствует HTTPContext, мне интересно, достаточно ли только вызова ReleaseAndDisposeAllHttpScopedObjects() для освобождения экземпляра ISession для этого потока?

1 Ответ

15 голосов
/ 23 июня 2011

Я узнал, как ответить на этот вопрос.Метод ReleaseAndDisposeAllHttpScopedObjects(), предоставляемый ObjectFactory, действительно касается HttpContext и, следовательно, веб-приложений.

Класс HybridLifeCycle из пространства имен Structuremap.Pipeline позволяет напрямую обращаться к кэшированным объектам в хранилище ThreadLocal и распоряжаться ими.Вот пример:

Action.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

Выше код регистрирует предоставленный тип и кэширует его экземпляры в HttpContext или хранилище ThreadLocal.Всегда полезно наследовать эти типы от IDisposable.Таким образом, в этом примере UnitOfWork также является IDisposable.

new HybridLifecycle().FindCache().DisposeAndClear();

Теперь для удаления кэшированных объектов независимо от веб-приложения или службы Windows, приведенной выше строки достаточно для удаления UnitOfWork вместо метода ReleaseAndDisposeAllHttpScopedObjects().Надеюсь, это кому-нибудь поможет.

...