Руководство по интеграции показывает, как использовать HttpModule для инициализации HttpHandlers . Однако HttpModule не создается для каждого запроса; он создается один раз для приложения и регистрируется в событиях HttpApplication
, когда вызывается его метод инициализации.
Поскольку модуль является одноэлементным, вы не должны вводить зависимости в свой модуль. Вы должны разрешать зависимости для каждого запроса, а поскольку HttpModule
не может быть настроен и не является собственной зависимостью, вам нужно будет вернуться в контейнер из вашего HttpModule
. Другого выхода нет, но здесь нужно свести к минимуму количество необходимого кода. Пример:
public class UsersOnlineModule : IHttpModule
{
public void Init(HttpApplication context) {
context.PreRequestHandlerExecute += (s, e) => {
var handler = Global.GetInstance();
handler.Handle();
};
}
}
В этом примере UsersOnlineModule
делает не что иное, как разрешение одной отдельной службы и вызов ее метода на ней. Эта служба (UsersOnlineHandler
в этом случае) должна отображать всю необходимую логику и зависимости. Другими словами, ваш HttpModule
становится Humble Object , и вся логика извлекается в UsersOnlineHandler
:
public class UsersOnlineHandler
{
private readonly ITenantStore tenantStore;
private readonly ICacheManager cm;
public UsersOnlineHandler(ITenantStore tenantStore, ICacheManager cm) {
this.tenantStore = tenantStore;
this.cm = cm;
}
public void Handle() {
// logic here
}
}
ПРЕДУПРЕЖДЕНИЕ: Убедитесь, что хранить любые зависимости в поля класса или экземпляра или свойства вашего HttpModule, потому что это может привести к тому, что зависимость станет Captive Dependency . Вместо этого, как описано выше, просто разрешите, используйте и забудьте об этой зависимости, все внутри этого вызова метода. Не храните его.