Pascal Precht의 블로그 게시물 덕분에 이것이 차이점을 이해하는 데 도움이되었습니다.
서비스는 이름과 서비스를 정의하는 기능을 취하는 모듈의 메소드입니다. 컨트롤러, 지시문 및 필터와 같은 다른 구성 요소에 특정 서비스를 주입하고 사용할 수 있습니다. 팩토리는 모듈의 메소드이며 팩토리를 정의하는 이름과 기능도 사용합니다. 또한 서비스와 동일한 방식으로 주입하여 사용할 수 있습니다.
new로 만든 객체는 생성자 함수의 prototype 속성 값을 프로토 타입으로 사용하므로 Object.create ()를 호출하는 Angular 코드를 찾았습니다. 인스턴스화 될 때 서비스 생성자 함수라고 생각합니다. 그러나 팩토리 함수는 실제로 호출되는 함수일 뿐이므로 팩토리에 대한 객체 리터럴을 반환해야합니다.
공장에서 찾은 각도 1.5 코드는 다음과 같습니다.
var needsRecurse = false;
var destination = copyType(source);
if (destination === undefined) {
destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
needsRecurse = true;
}
factory () 함수의 앵귤러 소스 코드 스 니펫 :
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
전달 된 이름과 팩토리 함수를 취하고 팩토리 함수 인 $ get 메소드가있는 동일한 이름의 제공자를 리턴합니다. 인젝터에 특정 종속성을 요청할 때마다 기본적으로 $ get () 메소드를 호출하여 해당 제공자에게 해당 서비스의 인스턴스를 요청합니다. 공급자를 만들 때 $ get ()이 필요한 이유입니다.
다음은 서비스를위한 앵귤러 1.5 코드입니다.
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
service ()를 호출하면 실제로 factory ()를 호출한다는 것이 밝혀졌습니다! 그러나 서비스 생성자 함수를 그대로 팩토리에 전달하지는 않습니다. 또한 주어진 생성자로 객체를 인스턴스화하도록 인젝터에게 요청하는 함수를 전달합니다.
즉, MyService를 어딘가에 주입하면 코드에서 발생하는 일은 다음과 같습니다.
MyServiceProvider.$get(); // return the instance of the service
다시 설명하기 위해 서비스는 팩토리를 호출합니다. 팩토리는 해당 제공자의 $ get () 메소드입니다. 또한 $ injector.instantiate ()는 궁극적으로 생성자 함수로 Object.create ()를 호출하는 메소드입니다. 이것이 우리가 서비스에서 "this"를 사용하는 이유입니다.
ES5의 경우 service () 또는 factory () 중 어느 것을 사용하든 상관없이 항상 서비스 팩토리를 만드는 팩토리입니다.
서비스에서도 똑같은 일을 할 수 있습니다. 그러나 서비스는 생성자 함수이지만 객체 리터럴을 반환하지 못하게합니다. 따라서 서비스 코드를 가져와 기본적으로 팩토리와 정확히 동일한 방식으로 수행하는 방식으로 작성할 수 있습니다. 즉, 팩토리로 서비스를 작성하여 객체를 반환 할 수 있습니다.
대부분의 사람들이 서비스보다는 공장을 사용하는 것을 권장하는 이유는 무엇입니까? 이것은 Pawel Kozlowski의 저서 : AngularJS를 사용한 웹 응용 프로그램 개발 마스터 링에서 얻은 최고의 답변입니다.
팩토리 메소드는 오브젝트를 AngularJS 종속성 주입 시스템으로 가져 오는 가장 일반적인 방법입니다. 매우 유연하고 정교한 생성 로직을 포함 할 수 있습니다. 팩토리는 정규 함수이므로 "사설"변수를 시뮬레이션하기 위해 새로운 어휘 범위를 활용할 수도 있습니다. 이는 특정 서비스의 구현 세부 사항을 숨길 수 있으므로 매우 유용합니다. "