Tolong bersamaku di sini. Saya tahu ada jawaban lain seperti: AngularJS: Layanan vs penyedia vs pabrik
Namun saya masih tidak tahu kapan Anda akan menggunakan layanan di pabrik.
Dari apa yang saya tahu pabrik biasanya digunakan untuk membuat fungsi "umum" yang dapat dipanggil oleh beberapa Pengontrol: Membuat fungsi pengendali umum
Dokumen Angular tampaknya lebih memilih pabrik daripada layanan. Mereka bahkan merujuk ke "layanan" ketika mereka menggunakan pabrik yang bahkan lebih membingungkan! http://docs.angularjs.org/guide/dev_guide.services.creating_services
Jadi kapan seseorang akan menggunakan layanan?
Adakah sesuatu yang hanya mungkin atau lebih mudah dilakukan dengan layanan?
Adakah hal berbeda yang terjadi di balik layar? Perbedaan kinerja / memori?
Ini sebuah contoh. Selain metode deklarasi, mereka tampak identik dan saya tidak tahu mengapa saya melakukan yang satu vs yang lain. http://jsfiddle.net/uEpkE/
Pembaruan: Dari jawaban Thomas, sepertinya menyiratkan bahwa layanan adalah untuk logika yang lebih sederhana dan pabrik untuk logika yang lebih kompleks dengan metode pribadi, jadi saya memperbarui kode biola di bawah ini dan tampaknya keduanya dapat mendukung fungsi pribadi?
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, Hi fooService"
$scope.foobars = [
fooFactory.getFoobar(),
fooService.getFoobar()
];
}
sumber
Jawaban:
Penjelasan
Anda punya berbagai hal di sini:
Pertama:
this
"kata kunci).ref: angular.service vs angular.factory
Kedua:
Ingatlah semua penyedia di AngularJS (nilai, konstan, layanan, pabrik) adalah lajang!
Ketiga:
Menggunakan satu atau yang lain (layanan atau pabrik) adalah tentang gaya kode. Tapi, cara umum di AngularJS adalah menggunakan pabrik .
Mengapa
( ref : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).
Pemakaian
Layanan: Dapat bermanfaat untuk berbagi fungsi utilitas yang berguna untuk dipanggil hanya dengan menambahkan
()
referensi fungsi yang disuntikkan. Bisa juga dijalankan denganinjectedArg.call(this)
atau serupa.Factory: Dapat bermanfaat untuk mengembalikan fungsi 'kelas' yang kemudian dapat baru untuk membuat instance.
Jadi, gunakan pabrik ketika Anda memiliki logika kompleks dalam layanan Anda dan Anda tidak ingin mengekspos kompleksitas ini .
Dalam kasus lain, jika Anda ingin mengembalikan instance layanan, gunakan saja layanan .
Tapi Anda akan melihat dengan waktu bahwa Anda akan menggunakan pabrik dalam 80% kasus saya pikir.
Untuk lebih jelasnya: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/
PEMBARUAN:
Pos yang sangat baik di sini: http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html
PEMBARUAN:
Tim AngularJS melakukan pekerjaannya dan memberikan penjelasan: http://docs.angularjs.org/guide/providers
Dan dari halaman ini:
sumber
allernhwkim awalnya mengirim jawaban pada pertanyaan ini yang menghubungkan ke blognya , namun seorang moderator menghapusnya. Ini satu-satunya pos yang saya temukan yang tidak hanya memberi tahu Anda bagaimana melakukan hal yang sama dengan layanan, penyedia dan pabrik, tetapi juga memberi tahu Anda apa yang dapat Anda lakukan dengan penyedia yang tidak dapat Anda lakukan dengan pabrik, dan dengan sebuah pabrik yang Anda tidak bisa dengan layanan.
Langsung dari blognya:
Ini menunjukkan bagaimana CarService akan selalu menghasilkan mobil dengan 4 silinder, Anda tidak dapat mengubahnya untuk setiap mobil. Sedangkan CarFactory mengembalikan fungsi sehingga Anda dapat melakukannya
new CarFactory
di controller Anda, melewati sejumlah silinder khusus untuk mobil itu. Anda tidak dapat melakukannyanew CarService
karena CarService adalah objek bukan fungsi.Alasan pabrik tidak bekerja seperti ini:
Dan secara otomatis mengembalikan fungsi bagi Anda untuk instantiate, karena Anda tidak dapat melakukan ini (tambahkan hal-hal ke prototipe / etc):
Lihat bagaimana sebenarnya pabrik yang memproduksi mobil.
Kesimpulan dari blognya cukup bagus:
Jika Anda baru saja mengembalikan objek di pabrik, Anda mungkin harus menggunakan layanan.
Jangan lakukan ini:
Gunakan layanan sebagai gantinya:
sumber
Konsep untuk semua penyedia ini jauh lebih sederhana daripada yang awalnya muncul. Jika Anda membedah penyedia Anda dan menarik bagian-bagian yang berbeda itu menjadi sangat jelas.
Sederhananya masing-masing penyedia ini adalah versi khusus dari yang lain, dalam urutan ini:
provider
>factory
>value
/constant
/service
.Begitu lama penyedia melakukan apa yang Anda bisa, Anda dapat menggunakan penyedia lebih lanjut dalam rantai yang akan menghasilkan lebih sedikit menulis kode. Jika itu tidak mencapai apa yang Anda inginkan, Anda dapat naik rantai dan Anda hanya perlu menulis lebih banyak kode.
Gambar ini menggambarkan apa yang saya maksud, dalam gambar ini Anda akan melihat kode untuk penyedia, dengan bagian-bagian yang disorot menunjukkan kepada Anda bagian mana dari penyedia yang dapat digunakan untuk membuat pabrik, nilai, dll.
(sumber: simplygoodcode.com )
Untuk detail lebih lanjut dan contoh-contoh dari posting blog di mana saya mendapatkan gambar dari pergi ke: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/
sumber
Baik pabrik maupun layanan menghasilkan objek tunggal yang dapat dikonfigurasi oleh penyedia dan disuntikkan ke dalam pengontrol dan menjalankan blok. Dari sudut pandang injectee, sama sekali tidak ada perbedaan apakah objek tersebut berasal dari pabrik atau layanan.
Jadi, kapan menggunakan pabrik, dan kapan menggunakan layanan? Itu bermuara pada preferensi pengkodean Anda, dan tidak ada yang lain. Jika Anda menyukai pola JS modular kemudian pergi ke pabrik. Jika Anda menyukai gaya fungsi konstruktor ("kelas"), pergilah ke layanan. Perhatikan bahwa kedua gaya mendukung anggota pribadi.
Keuntungan dari layanan ini mungkin lebih intuitif dari sudut pandang OOP: membuat "kelas", dan, bersama dengan penyedia, menggunakan kembali kode yang sama di seluruh modul, dan memvariasikan perilaku objek instantiated hanya dengan memasok parameter berbeda ke konstruktor di blok konfigurasi.
sumber
Tidak ada yang tidak dapat dilakukan atau dilakukan oleh Pabrik dengan lebih baik dibandingkan dengan Layanan. Dan sebaliknya. Pabrik sepertinya lebih populer. Alasannya adalah kemudahannya dalam menangani anggota pribadi / publik. Layanan akan lebih canggung dalam hal ini. Saat mengkode Layanan, Anda cenderung membuat anggota objek Anda publik melalui kata kunci "ini" dan tiba-tiba mengetahui bahwa anggota publik tersebut tidak terlihat oleh metode pribadi (yaitu fungsi dalam).
Angular menggunakan kata kunci "baru" untuk membuat layanan untuk Anda, jadi instance Angular yang lolos ke controller akan memiliki kelemahan yang sama. Tentu saja Anda dapat mengatasi masalah dengan menggunakan ini / itu:
Tetapi dengan konstanta Layanan yang besar, ini akan membuat kode tersebut terbaca dengan buruk. Selain itu, prototipe Layanan tidak akan melihat anggota pribadi - hanya publik yang akan tersedia untuk mereka:
Ringkasnya, menggunakan Factory lebih nyaman. Karena Factory tidak memiliki kekurangan ini. Saya akan merekomendasikan menggunakannya secara default.
sumber
myapp.service(...)
tidak ada sama sekali. Di mananew Service()
seharusnya dipanggil, dalam fungsi layanan atau di tempat Layanan disuntikkan. Daftar ketiga sama sekali tidak mungkin dalam konteksmyapp.service ('Service', function() {...})
.Bahkan ketika mereka mengatakan bahwa semua layanan dan pabrik adalah tunggal, saya tidak setuju 100 persen dengan itu. Saya akan mengatakan bahwa pabrik bukan lajang dan ini adalah inti dari jawaban saya. Saya benar-benar akan berpikir tentang nama yang mendefinisikan setiap komponen (Layanan / Pabrik), maksud saya:
Sebuah pabrik karena bukan singleton, Anda dapat membuat sebanyak yang Anda inginkan ketika Anda menyuntikkan, sehingga berfungsi seperti pabrik objek. Anda dapat membuat pabrik entitas domain Anda dan bekerja lebih nyaman dengan objek ini yang bisa seperti objek model Anda. Ketika Anda mengambil beberapa objek, Anda dapat memetakannya di objek ini dan itu dapat bertindak seperti lapisan lain antara DDBB dan model AngularJs. Anda dapat menambahkan metode ke objek sehingga Anda berorientasi ke objek sedikit lebih banyak aplikasi AngularJs Anda.
Sementara itu sebuah layanan adalah singleton, jadi kami hanya dapat membuat 1 jenis, mungkin tidak membuat tapi kami hanya memiliki 1 instance ketika kami menyuntikkan di controller, sehingga layanan menyediakan lebih seperti layanan umum (panggilan istirahat, fungsi ..) ke pengendali.
Secara konseptual Anda dapat berpikir seperti layanan menyediakan layanan, pabrik dapat membuat beberapa instance (objek) kelas
sumber
Jasa
Sintaks : module.service ('serviceName', function); Hasil : Saat mendeklarasikan serviceName sebagai argumen injeksi, Anda akan diberikan referensi fungsi aktual yang diteruskan ke module.service.
Penggunaan : Dapat bermanfaat untuk berbagi fungsi utilitas yang berguna untuk dipanggil hanya dengan menambahkan () ke referensi fungsi yang disuntikkan. Bisa juga dijalankan dengan injectedArg.call (ini) atau yang serupa.
Pabrik
Sintaks : module.factory ('factoryName', fungsi);
Hasil : Saat mendeklarasikan factoryName sebagai argumen injeksi, Anda akan diberikan nilai yang dikembalikan dengan memohon referensi fungsi yang diteruskan ke module.factory.
Penggunaan : Dapat berguna untuk mengembalikan fungsi 'kelas' yang kemudian dapat digunakan untuk membuat instance.
Penyedia
Sintaks : module.provider ('providerName', function);
Hasil : Ketika mendeklarasikan providerName sebagai argumen injeksi, Anda akan diberikan nilai yang dikembalikan dengan memanggil metode $ get dari referensi fungsi yang diteruskan ke module.provider.
Penggunaan : Dapat berguna untuk mengembalikan fungsi 'kelas' yang kemudian dapat baru untuk membuat instance tetapi yang membutuhkan semacam konfigurasi sebelum disuntikkan. Mungkin berguna untuk kelas yang dapat digunakan kembali di seluruh proyek? Masih agak kabur yang satu ini.
sumber
Dapat menggunakan kedua cara yang Anda inginkan : apakah membuat objek atau hanya untuk mengakses fungsi dari keduanya
Catatan :
Catatan :
Kesimpulan:
sumber
Pabrik dan Layanan adalah metode yang paling umum digunakan. Satu-satunya perbedaan di antara mereka adalah bahwa metode Layanan berfungsi lebih baik untuk objek yang membutuhkan hierarki warisan, sedangkan Pabrik dapat menghasilkan primitif dan fungsi JavaScript.
Fungsi Penyedia adalah metode inti dan semua yang lain hanya gula sintaksis di atasnya. Anda hanya membutuhkannya jika Anda sedang membangun bagian kode yang dapat digunakan kembali yang membutuhkan konfigurasi global.
Ada lima metode untuk membuat layanan: Nilai, Pabrik, Layanan, Penyedia, dan Konstan. Anda dapat mempelajari lebih lanjut tentang layanan bersudut sini , artikel ini menjelaskan semua metode ini dengan contoh demo praktis.
.
sumber