Каква е разликата между фабрика и услуга в AngularJS и кога трябва да се използва всеки?


Отговор 1:
angular.service ('apiService', apiServiceFunction);
angular.factory ('apiFactory', apiFactoryFunction);

Мисля, че този въпрос съществува от създаването на Factory and Service в AngularJS. Това е може би най-задаваният и спорен въпрос. Накратко, и двамата са еднолични и почти едно и също нещо с предупреждение:

Фабрика: фабричната функция (конструктор), която сме създали, ще се нарича.

apiFactoryInjected <--- apiFactoryFunction ()

Услуга: сервизната функция, която пишем, ще бъде създадена (нова)

  apiServiceInjected <---- нова apiFactoryFunction ()

Объркване? Добре вижте следната статия: AngularJS услуга срещу фабрика - с пример


Отговор 2:

Разликата между фабриката и услугата е точно като разликата между функция и обект

Фабричен доставчик

  • Дава ни връщащата стойност на функцията, т.е. Просто създавате обект, добавяте свойства към него и след това връщате същия обект. Когато прехвърлите тази услуга във вашия контролер, тези свойства на обекта вече ще бъдат налични в този контролер през вашата фабрика. (Хипотетичен сценарий) Може да използва други зависимости, Обикновено използвани, когато екземплярът на услугата изисква сложна логика за създаване, Използва се за не конфигурируеми услуги. Ако използвате обект, бихте могли да използвате фабричния доставчик.Syntax: module.factory ('factoryName', функция);

Доставчик на услуги

  • Дава ни екземпляр на функция (обект) - Вие просто се запознаете с ключовата дума „нов“ и ще добавите свойства към „това“ и услугата ще върне „това“. Когато прехвърлите услугата във вашия контролер, тези свойства на „това“ вече ще бъде наличен на този контролер чрез вашата услуга. (Хипотетичен сценарий) Можете да добавите свойства и функции към сервизен обект, като използвате тази ключова дума. Зависимостите се инжектират като аргументи на конструктора. Използвани за проста логика на създаване. Ако използвате клас, бихте могли да използвате доставчика на услугиSyntax: module.service ('serviceName', функция );

Общи черти

  • Singleton и ще бъде създаден само веднъж повторно използваем компонент, използван за комуникация между контролери за споделяне на данни, не може да се инжектира във .config () функция.

източник (красиво обяснение) - AngularJS: Фабрика и сервиз?

повече подробности - Сервиз срещу Фабрика - Веднъж завинаги

Надявам се да помогне !!


Отговор 3:

Обзалагам се, че не може да има по-добро обяснение от това!

Чакаме какво? Още една публикация / статия, която отговаря на големия въпрос: Сервиз срещу Фабрика, какво да използвам? Да, изглежда, че това вече не е необходимо, тъй като в интернет има много ресурси, които обсъждат тази тема. Оказва се, че този въпрос все още се появява всяка седмица или повече по различни канали и дори след като прочетете първите десет отговора на StackOverflow, все още не е много ясно. Въпреки това изглежда също, че настоящите ресурси в мрежата не насърчават действително най-добрите практики, особено ако вземем предвид последните движения на уеб платформата. ES6 гледам те!

Тази статия обяснява веднъж завинаги разликата между услугите и фабриките и защо искаме да предпочитаме услугите пред фабриките.

СЪДЪРЖАНИЕ

  • Разликата между услугите и фабриките Коя да използваме? Услугите ни позволяват да използваме класове ES6

Разликата между услугите и фабриките

Добре, така че каква е разликата между сервиз и фабрика в AngularJS? Както всички знаем, можем да определим услуга така:

app.service ('MyService', функция () {
  this.sayHello = функция () {
    console.log ( "здравей");
  };
});

.service () е метод на нашия модул, който приема име и функция, която определя услугата. Доста направо напред. След като бъдем дефинирани, можем да инжектираме и използваме тази конкретна услуга в други компоненти, като контролери, директиви и филтри, като този:

app.controller ('AppController', функция (MyService) {
  MyService.sayHello (); // регистрира „здравей“
});

Добре, ясно. Сега същото нещо като фабрика:

app.factory ('MyService', функция () {
  връщане {
    sayHello: function () {
      console.log ( "здравей");
    }
  }
});

Отново .factory () е метод на нашия модул и той също приема име и функция, които определят фабриката. Ние можем да инжектираме и използваме това нещо по същия начин, както направихме със услугата. Каква е разликата тук?

Е, може да видите, че вместо да работим с това във фабриката, ние връщаме обект буквално. Защо така? Оказва се, че услугата е конструкторска функция, докато фабриката не е. Някъде дълбоко в този ъглов свят, има този код, който призовава Object.create () с функцията на конструктора на услуги, когато стане инстанциран. Фабричната функция обаче е просто функция, която се извиква, поради което трябва да върнем обект изрично.

За да направим това малко по-ясно, можем просто да разгледаме изходния код на Angular. Ето как изглежда функцията factory ():

функция фабрика (име, factoryFn, налагане) {
  доставчик на връщане (име, {
    $ get: принудително! == false? ExecuceReturnValue (име, factoryFn): factoryFn
  });
}

Той отнема името и фабричната функция, която се предава и по същество връща доставчик със същото име, който има метод $ get, който е нашата фабрична функция. И така, какво е това с този доставчик? Е, всеки път, когато попитате инжектора за конкретна зависимост, той по принцип изисква от съответния доставчик пример за тази услуга, като се обади на метода $ get (). Ето защо при получаването на доставчици се изисква $ get ().

С други думи, ако поставим MyService някъде, това, което се случва зад кулисите, е:

MyServiceProvider $ GET (.); // върнете инстанцията на услугата

Добре, фабричните функции просто се обаждат, какво ще кажете за сервизния код? Ето още един фрагмент:

функция на услугата (име, конструктор) {
  връщане фабрика (име, ['$ инжектор', функция ($ инжектор) {
    върнете $ injector.instantiate (конструктор);
  }]);
}

О, вижте, оказва се, че когато извикваме услуга (), тя всъщност се обажда на фабриката (). Но това не просто предава функцията на нашия конструктор на услуги във фабриката. Той преминава функция, която изисква инжектора да инстанцира и обективира от дадения конструктор. С други думи: услуга извиква предварително дефинирана фабрика, която завършва като $ get () метод на съответния доставчик. $ injector.instantiate () е методът, който в крайна сметка извиква Object.create () с функцията конструктор. Ето защо използваме това в услугите.

Добре, така се оказва, че независимо от това, което използваме, услуга () или фабрика (), винаги се нарича фабрика, която създава доставчик за нашата услуга. Което ни отвежда до най-често задавания въпрос в историята на Angular: Кой от тях да използвам?

Кой да използвате?

Задаването на този въпрос в интернет ни отвежда до няколко статии и отговори на StackOverflow. Първият е този отговор. Казва:

„По принцип разликата между сервиз и фабрика е следната:“

app.service ('myService', функция () {

  // услугата е само конструкторска функция
  // който ще бъде извикан с „нов“

  this.sayHello = функция (име) {
     върнете "Здравей" + име + "!";
  };
});

app.factory ('myFactory', функция () {

  // фабрика връща обект
  // можете да стартирате някакъв код преди

  връщане {
    sayHello: функция (име) {
      върнете "Здравей" + име + "!";
    }
  }
});

Вече знаем какво се случва зад кулисите, но този отговор добавя още един коментар. Тя казва, че можем да стартираме код, преди да върнем обекта буквално. Това по принцип ни позволява да направим някои неща за конфигурация или условно да създадем обект или не, което изглежда не е възможно при директно създаване на услуга, поради което повечето ресурси препоръчват да се използват фабрики над услуги, но разсъжденията са неоценими.

Ами ако ви кажа, можем ли да направим точно същото и с услугите?

Да, правилно. Услугата е конструкторска функция, която обаче не ни пречи да вършим допълнителна работа и да връщаме обектни буквали. Всъщност функциите на конструктора в JavaScript могат да върнат каквото си поискат. Така че можем да вземем нашия сервизен код и да го напишем по такъв начин, че той по принцип прави абсолютно същото нещо като нашата фабрика:

app.service ('MyService', функция () {

  // и тук бихме могли да свършим допълнителна работа
  връщане {
    sayHello: function () {
      console.log ( "здравей");
    };
  }
});

Hoppla, така че сега? Току-що разбрахме, че в зависимост от това как пишем услугите си, вече няма разлика между двете. Големият въпрос остава: Кой да използваме?

Услугите ни позволяват да използваме класове ES6

Разбира се, писането на услуги по този начин е някакво контрапродуктивно, тъй като се нарича като конструкторска функция, така че също трябва да се използва като такава. Има ли някакво предимство пред другия изобщо? Да, има. Оказва се, че всъщност е по-добре да използвате услуги, когато е възможно, що се отнася до миграцията към ES6. Причината за това е просто, че услугата е конструкторска функция, а фабриката не е. Работата с конструкторски функции в ES5 ни позволява лесно да използваме класове ES6, когато мигрираме към ES6.

Например, можем да вземем нашия код и да го препишем в ES6 така:

клас MyService {
  кажи здравей() {
    console.log ( "здравей");
  }
}

app.service („MyService“, MyService);

Класът ES6 наистина е само конструкторска функция в ES5. За това писахме в Използването на ES6 с Angular днес, ако още не сте прочели тази статия, препоръчвам да я проверите.

При фабриките това не е възможно, защото те се наричат ​​просто като функции. Надявам се тази статия да е изяснила всичко и да насърчава хората да не използват фабрики за услуги, ако не знаят какво да използват.


Отговор 4:

Service Vs Service?

Добре, да започнем от Основите

Angular има вградени услуги, включително „Услуги“ и „Фабрики“

Във Фабриката създавате обект, добавяте свойства към него и връщате същия обект.

По време на услугата не създавате обект изрично, Angularjs го създава зад кулисите с „нова“ ключова дума, основно той конструира обекта с конструкторска функция.

Объркване? Нека го опростим с този пример.

app.service ( "myService ', serviceFunction)

app.factory ( "myFactory ', factoryFunction)

var serviceFunction = функция () {

// тук ще присвоите стойностите на тази функция с помощта на тази дума

// зад кулисите ъгъл ще обяви var this = {}

this.name = „abc от услуга“,

// върнете това

}

var factoryFunction = функция () {

var someObject = {}

someObject.name = „abc от фабриката“;

върнете someObject.name;

}

app.controller ( "myCtrl", функция (myService, myFactory) {

console.log („Данни от услуга“, myService) // o / p serviceFunction: {„name“: „abc from service“}

console.log („Данни от фабриката“, myFactory) // o / p „abc от фабриката“

})

така че в основата си в услуга ще върне целия екземпляр на функцията неявно ... но от фабриката можете да върнете всичко, което искате ... така че имате повече контрол във фабриката в сравнение с обслужването.

Надявам се, че това ви дава малка представа как се различават услугите и фабриката.

можете да поискате повече обяснения, ако искате.


Отговор 5:

Благодаря за A2A. Всъщност няма голяма разлика. Можете да направите едно и също и в двете. Все пак бих ви препоръчал да се придържате към услугите. Тъй като JavaScript се движи към структури, подобни на клас, Услугите са най-добрата практика. Например, ако сте имали услуга и сте предали функцията, тази функция всъщност е клас. Така че, ако махнете Angular от проекта си, пак ще можете да използвате всичко от услугата.


Отговор 6:

Разликата между услугите и фабриките

Добре, така че каква е разликата между сервиз и фабрика в AngularJS? Както всички знаем, можем да определим услуга така:

app.service ('MyService', функция () {
  this.sayHello = функция () {
    console.log ( "здравей");
  };
});

.service () е метод на нашия модул, който приема име и функция, която определя услугата. Доста направо напред. След като бъдем дефинирани, можем да инжектираме и използваме тази конкретна услуга в други компоненти, като контролери, директиви и филтри, като този:

app.controller ('AppController', функция (MyService) {
  MyService.sayHello (); // регистрира „здравей“
});

Добре, ясно. Сега същото нещо като фабрика:

app.factory ('MyService', функция () {
  връщане {
    sayHello: function () {
      console.log ( "здравей");
    }
  }
});

Отново .factory () е метод на нашия модул и той също приема име и функция, които определят фабриката. Ние можем да инжектираме и използваме това нещо по същия начин, както направихме със услугата. Каква е разликата тук?

Е, може да видите, че вместо да работим с това във фабриката, ние връщаме обект буквално. Защо така? Оказва се, че услугата е конструкторска функция, докато фабриката не е. Някъде дълбоко в този ъглов свят, има този код, който призовава Object.create () с функцията на конструктора на услуги, когато стане инстанциран. Фабричната функция обаче е просто функция, която се извиква, поради което трябва да върнем обект изрично.

За да направим това малко по-ясно, можем просто да разгледаме изходния код на Angular. Ето как изглежда функцията factory ():

функция фабрика (име, factoryFn, налагане) {
  доставчик на връщане (име, {
    $ get: принудително! == false? ExecuceReturnValue (име, factoryFn): factoryFn
  });
}

Той отнема името и фабричната функция, която се предава и по същество връща доставчик със същото име, който има метод $ get, който е нашата фабрична функция. И така, какво е това с този доставчик? Е, всеки път, когато попитате инжектора за конкретна зависимост, той по принцип изисква от съответния доставчик пример за тази услуга, като се обади на метода $ get (). Ето защо при получаването на доставчици се изисква $ get ().

С други думи, ако инжектираме MyServices някъде, това, което се случва зад кулисите, е:

MyServiceProvider $ GET (.); // върнете инстанцията на услугата

Добре, фабричните функции просто се обаждат, какво ще кажете за сервизния код? Ето още един фрагмент:

функция на услугата (име, конструктор) {
  връщане фабрика (име, ['$ инжектор', функция ($ инжектор) {
    върнете $ injector.instantiate (конструктор);
  }]);
}

О, вижте, оказва се, че когато извикваме услуга (), тя всъщност се обажда на фабриката (). Но това не просто предава функцията на нашия конструктор на услуги във фабриката. Той преминава функция, която изисква инжектора да инстанцира и обективира от дадения конструктор. С други думи: услуга извиква предварително дефинирана фабрика, която завършва като метод $ get () на съответния доставчик. $ injector.instantiate () е методът, който в крайна сметка извиква Object.create () с функцията конструктор. Ето защо използваме това в услугите.


Отговор 7:

Angular JS работи по отделяне на проблемите. За това разчита на сервизната архитектура. В това са предоставени някои вградени функции като $ location, $ http и др. Всяка функция е назначена с една единствена задача. Това са вградени услуги, които са с префикс със знак $. Но ако искаме да създадем собствена услуга, тогава използваме метод на обслужване. Така че методът на обслужване е API, който се използва за създаване на функции. Те се извикват по време на изпълнение. От друга страна фабричният метод не е друга опция за използване на Service architechture, той може да върши работата, която се извършва чрез сервизен метод, но не е като метод на обслужване. fcatory метод създава обекти за разлика от услугата, която е API за създаване на методи. Нека го разберем с пример.

функция getClass ($ http) {
  this.getClass = функция извличане () {
    върнете $ http.get ('class.htm');
  };
}

ъглов
  .module ( "приложението")
  .service ('getClass', getClass);
функция getClass ($ http) {
  return {// връща обект
    fetch: function () {// fuction, дефиниран в този обект
      върнете $ http.get ('class.htm');
    }
  };
}
ъглов
  .module ( "приложението")
  .factory ('getClass', getClass);

Отговор 8:

Angular JS работи по отделяне на проблемите. За това разчита на сервизната архитектура. В това са предоставени някои вградени функции като $ location, $ http и др. Всяка функция е назначена с една единствена задача. Това са вградени услуги, които са с префикс със знак $. Но ако искаме да създадем собствена услуга, тогава използваме метод на обслужване. Така че методът на обслужване е API, който се използва за създаване на функции. Те се извикват по време на изпълнение. От друга страна фабричният метод не е друга опция за използване на Service architechture, той може да върши работата, която се извършва чрез сервизен метод, но не е като метод на обслужване. fcatory метод създава обекти за разлика от услугата, която е API за създаване на методи. Нека го разберем с пример.

функция getClass ($ http) {
  this.getClass = функция извличане () {
    върнете $ http.get ('class.htm');
  };
}

ъглов
  .module ( "приложението")
  .service ('getClass', getClass);
функция getClass ($ http) {
  return {// връща обект
    fetch: function () {// fuction, дефиниран в този обект
      върнете $ http.get ('class.htm');
    }
  };
}
ъглов
  .module ( "приложението")
  .factory ('getClass', getClass);

Отговор 9:

Angular JS работи по отделяне на проблемите. За това разчита на сервизната архитектура. В това са предоставени някои вградени функции като $ location, $ http и др. Всяка функция е назначена с една единствена задача. Това са вградени услуги, които са с префикс със знак $. Но ако искаме да създадем собствена услуга, тогава използваме метод на обслужване. Така че методът на обслужване е API, който се използва за създаване на функции. Те се извикват по време на изпълнение. От друга страна фабричният метод не е друга опция за използване на Service architechture, той може да върши работата, която се извършва чрез сервизен метод, но не е като метод на обслужване. fcatory метод създава обекти за разлика от услугата, която е API за създаване на методи. Нека го разберем с пример.

функция getClass ($ http) {
  this.getClass = функция извличане () {
    върнете $ http.get ('class.htm');
  };
}

ъглов
  .module ( "приложението")
  .service ('getClass', getClass);
функция getClass ($ http) {
  return {// връща обект
    fetch: function () {// fuction, дефиниран в този обект
      върнете $ http.get ('class.htm');
    }
  };
}
ъглов
  .module ( "приложението")
  .factory ('getClass', getClass);

Отговор 10:

Angular JS работи по отделяне на проблемите. За това разчита на сервизната архитектура. В това са предоставени някои вградени функции като $ location, $ http и др. Всяка функция е назначена с една единствена задача. Това са вградени услуги, които са с префикс със знак $. Но ако искаме да създадем собствена услуга, тогава използваме метод на обслужване. Така че методът на обслужване е API, който се използва за създаване на функции. Те се извикват по време на изпълнение. От друга страна фабричният метод не е друга опция за използване на Service architechture, той може да върши работата, която се извършва чрез сервизен метод, но не е като метод на обслужване. fcatory метод създава обекти за разлика от услугата, която е API за създаване на методи. Нека го разберем с пример.

функция getClass ($ http) {
  this.getClass = функция извличане () {
    върнете $ http.get ('class.htm');
  };
}

ъглов
  .module ( "приложението")
  .service ('getClass', getClass);
функция getClass ($ http) {
  return {// връща обект
    fetch: function () {// fuction, дефиниран в този обект
      върнете $ http.get ('class.htm');
    }
  };
}
ъглов
  .module ( "приложението")
  .factory ('getClass', getClass);