AngularJS: متى تستخدم الخدمة بدلاً من المصنع




angularjs-service angularjs-factory (6)

تفسير

لديك أشياء مختلفة هنا:

أول:

  • إذا كنت تستخدم خدمة ، فستحصل على وظيفة دالة (" this " الكلمة الرئيسية).
  • إذا استخدمت مصنعًا ، فستحصل على القيمة التي يتم إرجاعها من خلال استدعاء مرجع الدالة (بيان الإرجاع في المصنع).

المرجع: angular.service vs angular.factory

ثانيا:

ضع في اعتبارك جميع مقدمي الخدمة في AngularJS (القيمة ، والثابت ، والخدمات ، والمصانع) فردية!

الثالث:

استخدام واحد أو آخر (خدمة أو مصنع) حول نمط التعليمات البرمجية. ولكن الطريقة الشائعة في AngularJS هي استخدام المصنع .

لماذا ا ؟

لأن "طريقة المصنع هي الطريقة الأكثر شيوعًا للحصول على الكائنات في نظام حقن التبعية AngularJS. فهي مرنة جدًا ويمكن أن تحتوي على منطق إنشاء متطور. بما أن المصانع وظائف منتظمة ، يمكننا أيضًا الاستفادة من نطاق معجم جديد لمحاكاة" "المتغيرات. هذا مفيد جدًا حيث يمكننا إخفاء تفاصيل تنفيذ خدمة معينة."

( المرجع : http://www.amazon.com/Mastering-Web-Application-Development-AngularJS/dp/1782161821 ).

استعمال

الخدمة: يمكن أن يكون مفيدا لمشاركة وظائف المرافق المفيدة التي يمكن استدعاؤها بمجرد إلحاق () بمرجع الدالة المحقون. يمكن أيضا أن يتم تشغيل مع injectedArg.call(this) أو ما شابه ذلك.

المصنع: يمكن أن يكون مفيدا في إرجاع وظيفة "الطبقة" التي يمكن أن تكون جديدة بعد ذلك لإنشاء حالات.

لذا ، استخدم مصنعًا عندما يكون لديك منطقًا معقّدًا في خدمتك ولا تريد فضح هذا التعقيد .

في حالات أخرى ، إذا كنت تريد إرجاع مثيل من الخدمة ، فما عليك سوى استخدام الخدمة .

ولكنك سترى بمرور الوقت أنك ستستخدم المصنع في 80٪ من الحالات على ما أعتقد.

لمزيد من التفاصيل: http://blog.manishchhabra.com/2013/09/angularjs-service-vs-factory-with-example/

تحديث :

وظيفة ممتازة هنا: http://iffycan.blogspot.com.ar/2013/05/angular-service-or-factory.html

"إذا كنت تريد استدعاء وظيفتك كوظيفة عادية ، فاستخدم المصنّع . إذا كنت تريد أن يتم إنشاء وظيفتك مع المشغل الجديد ، فاستخدم الخدمة. إذا كنت لا تعرف الفرق ، فاستخدم المصنّع".

تحديث :

فريق AngularJS يقوم بعمله ويقدم تفسيرا: http://docs.angularjs.org/guide/providers

ومن هذه الصفحة:

"المصنع والخدمة هما أكثر الوصفات استخدامًا. والفرق الوحيد بينهما هو أن وصفة الخدمة تعمل بشكل أفضل مع الكائنات من النوع المخصص ، في حين أن المصنع يمكن أن ينتج أدوات ووظائف JavaScript الأساسية".

يرجى تحمل معي هنا. وأنا أعلم أن هناك إجابات أخرى مثل: AngularJS: خدمة مقابل مقابل مقابل مصنع

ومع ذلك ، لا أتمكن من معرفة متى تستخدم الخدمة على المصنع.

من ما يمكنني معرفته بالمصنع يستخدم عادة لإنشاء وظائف "شائعة" يمكن استدعاءها من خلال وحدات تحكم متعددة: إنشاء وظائف وحدة تحكم شائعة

يبدو أن المستندات الزاويّة تفضل المصنع على الخدمة. حتى أنهم يشيرون إلى "الخدمة" عندما يستخدمون مصنعًا أكثر إرباكًا! http://docs.angularjs.org/guide/dev_guide.services.creating_services

متى سيستخدم أحد الخدمة؟

هل هناك شيء ممكن فقط أو أسهل بكثير من خلال الخدمة؟

هل هناك شيء مختلف يجري وراء الكواليس؟ الاختلافات الأداء / الذاكرة؟

وهنا مثال على ذلك. بخلاف طريقة الإعلان ، يبدو أنها متطابقة ولا يمكنني معرفة لماذا أفعل أحدها مقابل الآخر. http://jsfiddle.net/uEpkE/

تحديث: من إجابة توماس يبدو أن هذه الخدمة تعني منطقًا بسيطًا ومصنعًا لمنطق أكثر تعقيدًا بطرق خاصة ، لذلك قمت بتحديث رمز كمان أدناه ويبدو أن كلاهما قادر على دعم الوظائف الخاصة؟

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()
    ];
}

حتى عندما يقولون أن جميع الخدمات والمصانع فردية ، أنا لا أتفق مع ذلك بنسبة 100٪. أود أن أقول إن المصانع ليست مفردة ، وهذا هو جواب جوابي. أود حقا أن أفكر في الاسم الذي يحدد كل مكون (خدمة / مصنع) ، أعني:

مصنع لأنه ليس مفرداً ، يمكنك إنشاء العدد الذي تريده عندما تقوم بحقن ، لذلك يعمل مثل مصنع من الكائنات. يمكنك إنشاء مصنع لجهة تابعة لنطاقك والعمل بشكل أكثر سهولة مع هذه الكائنات التي يمكن أن تكون مثل كائن من نموذجك. عندما تقوم باسترداد عدة كائنات ، يمكنك تعيينها في هذه الكائنات ، ويمكن أن تعمل نوعًا من طبقة أخرى بين DDBB ونموذج AngularJs. يمكنك إضافة طرق إلى الكائنات بحيث يمكنك توجيه الكائنات أكثر من تطبيق AngularJs.

في هذه الأثناء تكون الخدمة مفردة ، لذا يمكننا فقط إنشاء واحد من نوع ما ، ربما لا نخلق ولكن لدينا مثيل واحد فقط عندما نحقن في جهاز تحكم ، لذلك توفر الخدمة خدمة أشبه بالخدمة المشتركة (مكالمات الراحة ، الوظيفة ...) إلى وحدات التحكم.

من الناحية النظرية ، يمكنك التفكير في أن الخدمات تقدم خدمة ، يمكن للمصانع إنشاء نسخ متعددة (كائنات) من الفصل الدراسي


مفهوم كل هذه مقدمي هو أبسط بكثير مما يبدو في البداية. إذا قمت بتشريح مقدم الخدمة وقمت بسحب الأجزاء المختلفة فإنه يصبح واضحا جدا.

وببساطة ، كل واحد من هؤلاء مقدمي الخدمة هو نسخة متخصصة للآخر ، بالترتيب التالي: provider > factory > value / constant / service .

طالما يقوم مقدم الخدمة بما يمكنك القيام به ، يمكنك استخدام الموفر في أسفل السلسلة مما يؤدي إلى كتابة رمز أقل. إذا لم تحقق ما تريده ، فيمكنك الانتقال إلى أعلى السلسلة وستحتاج فقط إلى كتابة المزيد من الشفرات.

توضح هذه الصورة ما أعنيه ، في هذه الصورة سترى رمز موفر ، مع أجزاء محددة تظهر لك أي أجزاء من الموفر يمكن استخدامها لإنشاء مصنع ، وقيمة ، وما إلى ذلك بدلاً من ذلك.

موفرو AngularJS ، والمصانع ، والخدمات ، وما إلى ذلك هي كل نفس الشيء http://www.simplygoodcode.com/wp-content/uploads/2015/11/angularjs-provider-service-factory-highlight.png

لمزيد من التفاصيل والأمثلة من منشور المدونة ، حيث حصلت على الصورة من: http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/


نشرت allernhwkim الأصل إجابة حول هذا السؤال allernhwkim ، إلا أن المشرف قام بحذفها. إنها المنشور الوحيد الذي وجدته والذي لا يخبرك فقط عن كيفية القيام بنفس الشيء مع الخدمة والمزود والمصنع ، ولكن أيضًا يخبرك بما يمكنك القيام به مع مزود لا يمكنك القيام به مع مصنع ، ومع مصنع لا يمكنك الحصول عليه من خلال الخدمة.

مباشرة من مدونته:

app.service('CarService', function() {
   this.dealer="Bad";
    this.numCylinder = 4;
});

app.factory('CarFactory', function() {
    return function(numCylinder) {
      this.dealer="Bad";
        this.numCylinder = numCylinder
    };
});

app.provider('CarProvider', function() {
    this.dealerName = 'Bad';
    this.$get = function() {
        return function(numCylinder) {
            this.numCylinder = numCylinder;
            this.dealer = this.dealerName;
        }
    };
    this.setDealerName = function(str) {
      this.dealerName = str;
    }      
});

هذا يوضح كيف أن CarService سوف ينتج دائما سيارة مع 4 اسطوانات ، لا يمكنك تغييرها للسيارات الفردية. في حين يقوم CarFactory بإرجاع وظيفة حتى تتمكن من عمل new CarFactory في جهاز التحكم الخاص بك ، مرورًا بعدد من الاسطوانات الخاصة بتلك السيارة. لا يمكنك أن تفعل new CarService لأن CarService هو كائن وليس وظيفة.

السبب لا تعمل المصانع على هذا النحو:

app.factory('CarFactory', function(numCylinder) {
      this.dealer="Bad";
      this.numCylinder = numCylinder
});

وتعود تلقائيا وظيفة لك لتكوين ، هو لأنه لا يمكنك القيام بذلك (إضافة أشياء إلى النموذج الأولي / الخ):

app.factory('CarFactory', function() {
    function Car(numCylinder) {
        this.dealer="Bad";
        this.numCylinder = numCylinder
    };
    Car.prototype.breakCylinder = function() {
        this.numCylinder -= 1;
    };
    return Car;
});

انظر كيف هو حرفيا مصنع إنتاج سيارة.

الاستنتاج من مدونته جيد جدًا:

فى الختام،

---------------------------------------------------  
| Provider| Singleton| Instantiable | Configurable|
---------------------------------------------------  
| Factory | Yes      | Yes          | No          |
---------------------------------------------------  
| Service | Yes      | No           | No          |
---------------------------------------------------  
| Provider| Yes      | Yes          | Yes         |       
---------------------------------------------------  
  1. استخدم الخدمة عندما تحتاج إلى مجرد كائن بسيط مثل Hash ، على سبيل المثال {foo؛ 1، bar: 2} من السهل التعليمة البرمجية ، ولكن لا يمكنك إنشاء مثيل لها.

  2. استخدم المصنع عندما تحتاج إلى إنشاء كائن ، أي عميل جديد () ، تعليق جديد () ، إلخ.

  3. استخدم مزودًا عندما تحتاج إلى تهيئته. أي اختبار رابط ، سؤال وجواب URL ، إنتاج رابط.

إذا وجدت أنك تقوم فقط بإرجاع كائن في المصنع ، فمن المحتمل أنك تستخدم الخدمة.

لا تفعل هذا:

app.factory('CarFactory', function() {
    return {
        numCylinder: 4
    };
});

استخدم الخدمة بدلاً من ذلك:

app.service('CarService', function() {
    this.numCylinder = 4;
});

ينتج كل من المصنع والخدمة عن كائنات مفردة يمكن تكوينها من قبل مقدمي الخدمة ويتم حقنها في وحدات التحكم وتشغيل الكتل. من وجهة نظر الحقن ، لا يوجد فرق على الإطلاق فيما إذا كان الهدف من المصنع أو الخدمة.

لذا ، متى يتم استخدام المصنع ، ومتى تستخدم الخدمة؟ انها تتلخص في تفضيلات الترميز الخاص بك ، ولا شيء غير ذلك. إذا كنت ترغب في نمط JS وحدات ثم انتقل للمصنع. إذا كنت تحب أسلوب وظيفة منشئ ("الفئة") ثم انتقل للخدمة. لاحظ أن كلا الأنماط تدعم الأعضاء الخاصين.

قد تكون ميزة الخدمة أنه أكثر بديهية من وجهة نظر OOP: إنشاء "class" ، و بالتزامن مع موفر ، إعادة استخدام نفس التعليمة البرمجية عبر الوحدات النمطية ، وتغيير سلوك الكائنات التي تم إنشاء مثيل لها ببساطة عن طريق توفير معلمات مختلفة لمنشئ في كتلة التكوين.


خدمات

بناء الجملة : module.service ('serviceName'، function)؛ النتيجة : عند التصريح عن serviceName كوسيطة قابلة للحقن ، سيتم تقديم مرجع الوظيفة الفعلي الذي تم تمريره إلى module.service.

الاستخدام : يمكن أن يكون مفيدا لتبادل وظائف المرافق التي من المفيد أن تستدعي بمجرد الإلحاق () إلى مرجع الدالة المحقون. يمكن أيضا أن يتم تشغيل مع injectedArg.call (هذا) أو ما شابه ذلك.

المصانع

بناء الجملة : module.factory ('factoryName' ، وظيفة) ؛

النتيجة : عند التصريح بالتسمية factoryName كوسيطة قابلة للحقن ، سيتم تقديم القيمة التي يتم إرجاعها من خلال استدعاء مرجع الوظيفة الذي تم تمريره إلى module.factory.

الاستخدام : يمكن أن يكون مفيدا لإرجاع وظيفة "الفئة" التي يمكن بعد ذلك أن تكون جديدة لإنشاء مثيلات.

مقدمي

بناء الجملة : module.provider ('providerName'، function)؛

النتيجة : عند التصريح عن اسم الموفر كوسيطة قابلة للحقن ، سيتم تقديم القيمة التي يتم إرجاعها من خلال استدعاء أسلوب $ get لمرجع الوظيفة الذي تم تمريره إلى module.provider.

الاستخدام : يمكن أن يكون مفيدا في استعادة وظيفة "الفئة" التي يمكن بعد ذلك أن تكون جديدة لإنشاء مثيلات ولكن ذلك يتطلب نوعا من التكوين قبل أن يتم حقنه. ربما مفيدة للصفوف التي يمكن إعادة استخدامها عبر المشاريع؟ لا يزال نوع من ضبابي على هذا واحد.





angularjs-factory