Pascal Precht'in bir blog yazısı sayesinde farkı anlamama yardımcı olan şey buydu.
Hizmet, modülü tanımlayan, adı tanımlayan ve işlevi tanımlayan bir işlevdir. Söz konusu hizmeti denetleyiciler, yönergeler ve filtreler gibi diğer bileşenlere enjekte edebilir ve kullanabilirsiniz. Fabrika, bir modül üzerindeki bir yöntemdir ve aynı zamanda fabrikayı tanımlayan bir isim ve fonksiyon alır. Ayrıca, bunu servisle yaptığımız şekilde enjekte edebilir ve kullanabiliriz.
Yeni ile oluşturulan nesneler kendi prototipi olarak onların yapıcı işlevinin prototip özelliğinin değerini kullanın, bu yüzden ben nesne oluşturulduğunda hizmet yapıcı işlevi olduğuna inanıyorum Object.create () çağıran Açısal kodu buldum. Bununla birlikte, bir fabrika işlevi gerçekten sadece çağrılan bir işlevdir, bu yüzden fabrika için bir nesneyi döndürmek zorundayız.
İşte fabrika için bulduğum açısal 1.5 kodu:
var needsRecurse = false;
var destination = copyType(source);
if (destination === undefined) {
destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
needsRecurse = true;
}
Factory () işlevi için açısal kaynak kod snippet'i:
function factory(name, factoryFn, enforce) {
return provider(name, {
$get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
});
}
Geçilen adı ve fabrika işlevini alır ve aynı ada sahip, fabrika işlevimiz olan $ get yöntemine sahip bir sağlayıcı döndürür. Enjektörden belirli bir bağımlılık istediğinizde, temel olarak ilgili sağlayıcıdan $ get () yöntemini çağırarak o hizmetin bir örneğini ister. Bu yüzden sağlayıcılar oluştururken $ get () gereklidir.
İşte hizmet için açısal 1.5 kodu.
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
Service () öğesini çağırdığımızda, aslında factory () öğesini çağırdığı ortaya çıkıyor! Ancak, sadece servis yapıcı fonksiyonumuzu fabrikaya olduğu gibi aktarmakla kalmıyor. Ayrıca enjektörden belirli bir kurucu tarafından bir nesneyi başlatmasını isteyen bir işlevi de geçer.
Başka bir deyişle, MyService'i bir yere enjekte edersek, kodda ne olur:
MyServiceProvider.$get(); // return the instance of the service
Yeniden başlatmak için, bir hizmet ilgili fabrikadaki $ get () yöntemi olan bir fabrikayı çağırır. Ayrıca, $ injector.instantiate (), nihai olarak yapıcı işleviyle Object.create () yöntemini çağıran yöntemdir. Bu yüzden hizmetlerde "bunu" kullanıyoruz.
ES5 için hangisini kullandığımız önemli değil: service () veya factory (), her zaman servisimiz için bir sağlayıcı oluşturan denilen bir fabrika.
Aynı şeyi hizmetlerle de yapabilirsiniz. Hizmet, yapıcı işlevidir, ancak nesne değişmezlerini döndürmemizi engellemez. Böylece servis kodumuzu alıp temelde fabrikamızla aynı şeyi yapacak şekilde yazabiliriz veya başka bir deyişle, bir nesneyi döndürmek için fabrika olarak bir hizmet yazabilirsiniz.
Neden çoğu insan fabrikaları servisler üzerinde kullanmanızı önerir? Bu, Pawel Kozlowski'nin AngularJS ile Web Uygulaması Geliştirmede Mastering adlı kitabından gelen en iyi cevap.
Fabrika yöntemi, nesneleri AngularJS bağımlılık enjeksiyon sistemine sokmanın en yaygın yoludur. Çok esnektir ve gelişmiş yaratım mantığı içerebilir. Fabrikalar düzenli işlevler olduğundan, "özel" değişkenleri simüle etmek için yeni bir sözlüksel kapsamdan da yararlanabiliriz. Bu, belirli bir hizmetin uygulama ayrıntılarını gizleyebildiğimiz için çok yararlı. "