Пользовательская инъекция зависимости HttpModule с простым инжектором [дубликат]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

1
задан Steven 17 November 2014 в 14:07
поделиться

1 ответ

Руководство по интеграции показывает, как использовать HttpModule для инициализации HttpHandlers . Однако HttpModule не создается для каждого запроса; он создается один раз для приложения и регистрируется в событиях HttpApplication, когда вызывается его метод инициализации.

Поскольку модуль является одноэлементным, вы не должны вводить зависимости в свой модуль. Вы должны разрешать зависимости для каждого запроса, а поскольку HttpModule не может быть настроен и не является собственной зависимостью, вам нужно будет вернуться в контейнер из вашего HttpModule. Другого выхода нет, но здесь нужно свести к минимуму количество необходимого кода. Пример:

public class UsersOnlineModule : IHttpModule
{
    public void Init(HttpApplication context) {
        context.PreRequestHandlerExecute += (s, e) => {
            var handler = Global.GetInstance<UsersOnlineHandler>();
            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 . Вместо этого, как описано выше, просто разрешите, используйте и забудьте об этой зависимости, все внутри этого вызова метода. Не храните его.

2
ответ дан Steven 27 August 2018 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: