programing

Angularjs를 사용하여 프로바이더에 의존관계를 주입하려면 어떻게 해야 합니까?

codeshow 2023. 3. 28. 22:20
반응형

Angularjs를 사용하여 프로바이더에 의존관계를 주입하려면 어떻게 해야 합니까?

프로바이더 방식으로 DI가 가능한가요?

이 예에서는

angular.module('greet',[])
.provider('greeter',function() {

  this.$get=function() {

  };
})
.service('greeterService',function($http){
  console.log($http);
})
;

주입$httpinto service는 올바른 구현으로 보이지만 공급자 방식으로는 작동하지 않고 다음과 같은 오류가 발생합니다.

알 수 없는 공급자: $http

프로바이더 메서드는 DI와 연동하여 서비스를 주입합니까?

확실히 주사할 수 있어요.$http프로바이더에 접속합니다.에 표시되는 것을 확인해 주세요.$get함수 생성자가 아닙니다.다음과 같습니다.

angular.module('greet',[]).provider('greeter',function() {
  this.$get = function($http) {

  };
});

공급자에 상수 및 기타 공급자를 주입할 수 있습니다.서비스도 공장도 아닙니다.한 가지 예외가 있습니다.주사할 수 있을 것 같아요$injector적어도 AngularJS 1.3.16에서는 가능합니다.

.provider('foo', ['$injector', function ($injector) {
  var messagePrefix = $injector.get('msgPrefix');
  this.message = '';

  this.$get = function() {
    var that = this;
    return function() {
      return messagePrefix + that.message;
    }
  };
}])

주입기를 외부로 사용할 수 있습니다.$get메서드는 설정 시 서비스를 받을 수 없습니다.

데모는 이쪽을 참조해 주세요.

IgrCnd의 답변에 따라 잠재적인 악질성을 회피할 수 있는 패턴을 다음에 제시하겠습니다.

angular.module('greet',[]).provider('greeter', function() {

    var $http;

    function logIt() {
        console.log($http);
    }

    this.$get = ['$http', function(_$http_) {
        $http = _$http_;

        return {
            logIt: logIt
        };
    }];
});

이는 동등한 서비스와 얼마나 유사한지 주의하여 두 서비스 간의 변환이 덜 번거롭습니다.

angular.module('greet',[]).factory('greeter', ['$http', function($http) {

    function logIt() {
        console.log($http);
    }

    return {
        logIt: logIt
    };
});

실제로 $get에 대한 의존관계를 주입하고 $get에서 취득한 항목에 사용하기 위해 저장해야 합니다.전혀 아름답지 않아...

아니요, 공급자 자체에 서비스를 삽입할 수 없습니다.공급자의 $get 메서드에 서비스를 주입하는 것은 공장에 서비스를 주입하는 것과 동일하지만 공급자의 기능에 직접 주입할 수는 없습니다.

$get과 공급자 자체의 차이점은 공급자가 모듈 로드 단계에서 실행되는 반면 $get은 제공하는 서비스를 인스턴스화할 때 실행됩니다.

이는 모듈의 로드/설정 단계에서는 서비스를 전혀 사용할 수 없음을 의미합니다.앱 루트나 상태를 정의할 때 등 구성 블록 내에서 실행하는 모든 작업은 서비스를 사용할 수 없습니다.

프로바이더 이외에 설정 블록에 주입할 수 있는 것은 상수뿐입니다.

IgrCndd가 제안한 대로 할 수 있어단, 프로바이더의 목적인 설정 블록에서 프로바이더를 소비할 필요가 있는 경우에는 그 후가 될 때까지 값이 주입되지 않습니다.그러니 약속을 이용해서 좀 지저분한 해킹을 하지 않는 한 효과가 없을 겁니다.

주입품에 대한 추가 판독치

언급URL : https://stackoverflow.com/questions/19171207/how-to-inject-dependencies-into-a-provider-using-angularjs

반응형