1

각도 서비스를 저장하기 위해 전역 개체를 사용하는 일부 코드를 상속 받았습니다. 이러한 서비스는 각 모듈의 실행 기능에서 전역 개체에 연결됩니다. 제 궁금한 점은 이것이 길을 찾아가는 데 어려움을 겪을 수 있습니까? 테스트에서 어떤 문제가 발생합니까? 이처럼 서비스를 전달하는 것은 각 컨트롤러에 모든 서비스를 주입하는 것보다 훨씬 쉽습니다. 이것을하지 않는 다른 주장은 무엇입니까? 내가 말하는 것에 대해 설명하기위한 몇 가지 코드는 다음과 같습니다.전역 개체를 사용하여 각도 의존성 주입 방지

// vars 
var globalObject = 
{ 
    ng: {}, 
}; 

// Setup module 
var myModule = angular.module("myModule", []); 
myModule.config(doStuff); 
myModule.run(setUpGlobals); 

// Setup app globals 
function setUpGlobals(ngRootScope, ngHttp, ngTimeout) 
{ 
    globalObject.rootScope = ngRootScope; 

    // angular services 
    globalObject.ng.http = ngHttp; 
    globalObject.ng.Timeout = ngTimeout; 
} 
setUpGlobals.$inject = ['$rootScope', '$http', '$timeout']; 

답변

1

모듈 및 DI는 전역에 의존하는 것을 피하고 모듈성을 개선하기 위해 정확히 각도로 도입되었습니다.

이것은 단일 모듈과 단일 응용 프로그램 인스턴스가있는 경우에만 작동하는 순진한 접근 방식입니다. 별도로 사용할 수있는 모듈이 여러 개 있으면 (테스트 포함) 실패합니다. 페이지에 둘 이상의 응용 프로그램 인스턴스가있는 경우 (예 : Angular가 SPA가 아닌 응용 프로그램에 사용되는 경우) 끔찍한 버그가 생성됩니다.

모노리스 모듈은 테스트 가능성을 해친다. 이와 같이 사용 되더라도 일부 옵션을 사용할 수 없습니다. 컨트롤러가 글로벌에 의존하기 때문에 스파이 또는 스터브 서비스를 $controller(...)에 주입합니다.

setUpGlobals 결과가 서비스 인스턴스화에 도움이됩니다. 이것은 핵심 서비스에서는 문제가되지 않지만 지금은 인스턴스화 할 필요가없는 서비스에서는 문제가됩니다.

덜 중요한 관심은 축소 된 응용 프로그램의 코드 크기입니다. ng.$rootScopea.$rootScope으로 축소 할 수 있지만 더 이상은 사용할 수 없습니다. 주석 된 함수는 '$rootScope' 문자열을 한 번 언급해야하지만 $rootScope 변수 이름은 a으로 축소 될 수 있습니다. 함수가 함수 내에서 두 번 이상 사용되면 개선 될 것입니다.

많은 이유가 있습니다. why global variables are bad입니다. 그 중 일부는이 경우에는 적용되지 않으며 다른 일부는 적용되지 않습니다.

+0

감사합니다. 서비스가 필요시 인스턴스화된다는 사실을 알지 못했습니다. https://www.bennadel.com/blog/2715-services-and-factories-are-instantiated-on-demand-in-angularjs.htm –

+1

여러분을 환영합니다. 대부분이 문제는 아니지만 자연 동작 (예 : 지연로드)에 의존하는 기능을 손상시킬 수 있습니다. – estus

+0

질문 하나 더 : 서비스가 다른 모듈에서 싱글 톤으로 작동합니까? 그들은 동일한 모듈을 위해 수행하지만 모듈 A와 모듈 B가 서비스 1을 주입하면 서비스 1이 공유됩니까? –

1

이렇게하면 유령을 테스트 할 수 있습니다. Dependency Injection은 필요없는 서비스를 조롱함으로써 원자력 테스트를 할 수 있다는 것을 의미하기 때문에 훌륭합니다. 간단하고 혼란스럽지 않은 예제에서 http를 통해 API 호출을하는 서비스를 상상해보십시오. DI를 사용하면 테스트에서 http를 조롱하고 반환 값을 가짜로 만들어 원하는 코드 만 테스트 할 수 있습니다. API를 사용하는 테스트를 수행하지 않거나 API 호출을 사용하는 테스트 슈트를 악화시킬 수 있습니다. 글로벌 범위에있는 공급 업체의 경우 달성하기가 훨씬 더 어렵습니다.

한 가지 이유가 있습니다. 다른 많은 것들이있을 것입니다.

+0

사실, 테스트가 그렇게 나쁘지는 않습니다. 하나의 모듈이있는 한, 각 테스트에서 전역이 재 할당됩니다. 그러나 요점은 이것이 단일 일 필요는 없다는 것입니다. 그리고 한번 문제가 될 것입니다. – estus