পরিষেবা বনাম কারখানা সম্পর্কে বিভ্রান্ত


618

আমি এটি বুঝতে পেরেছি, কারখানার অভ্যন্তরে যখন আমি কোনও বস্তু ফিরে পাই যা একটি কন্ট্রোলারে ইনজেকশন হয়ে যায়। কোনও পরিষেবার ভিতরে থাকাকালীন আমি কোনও জিনিস ব্যবহার করে thisএবং কোনও জিনিস ফেরত না দিয়ে ডিল করছি ।

আমি এই ধারণার অধীনে ছিলাম যে পরিষেবাটি সর্বদা সিঙ্গলটন থাকে এবং প্রতিটি নিয়ামকটিতে একটি নতুন কারখানার অবজেক্ট ইনজেকশন হয়। যাইহোক, এটি দেখা যাচ্ছে যে, একটি কারখানার অবজেক্টটিও সিঙ্গলটন?

প্রদর্শিত কোড উদাহরণ:

var factories = angular.module('app.factories', []);
var app = angular.module('app',  ['ngResource', 'app.factories']);

factories.factory('User', function () {
  return {
    first: 'John',
    last: 'Doe'
  };
});

app.controller('ACtrl', function($scope, User) {
  $scope.user = User;
});

app.controller('BCtrl', function($scope, User) {
  $scope.user = User;
});

যখন পরিবর্তন user.firstমধ্যে ACtrlএটা দেখা যাচ্ছে যে user.firstBCtrlএছাড়াও পরিবর্তিত হয়, যেমন Userএকটি Singleton হয়?

আমার ধারণাটি ছিল যে কোনও কারখানার সাথে নিয়ামকটিতে একটি নতুন উদাহরণ প্রবেশ করা হয়েছিল?


4
"মডিউল.সওয়ারিস" এবং "মডিউল.ফ্যাক্টরি" এর পরে অ্যাংুলারজেজেসে পরিষেবা তৈরির জন্য আরও দুটি উপায় রয়েছে। ব্লগ পোস্ট দ্বারা আরও তথ্যের জন্য চেক করুন: " 4 টি বিভিন্ন উপায়ে অ্যাঙ্গুলারজেএস পরিষেবাদি (সিঙ্গলটন) কীভাবে তৈরি করবেন "
এমিল ভ্যান গ্যালেন

উত্তর:


600

সমস্ত কৌণিক পরিষেবাগুলি সিলেটলেট :

দস্তাবেজগুলি ( পরিষেবাদিগুলিকে একক হিসাবে দেখায় ): https://docs.angularjs.org/guide/services

শেষ অবধি, এটি উপলব্ধি করা গুরুত্বপূর্ণ যে সমস্ত কৌণিক পরিষেবাগুলি অ্যাপ্লিকেশন সিঙ্গেলন। এর অর্থ ইনজেক্টর প্রতি প্রদত্ত পরিষেবার কেবলমাত্র একটি উদাহরণ রয়েছে।

মূলত পরিষেবা এবং কারখানার মধ্যে পার্থক্য নিম্নরূপ:

app.service('myService', function() {

  // service is just a constructor function
  // that will be called with 'new'

  this.sayHello = function(name) {
     return "Hi " + name + "!";
  };
});

app.factory('myFactory', function() {

  // factory returns an object
  // you can run some code before

  return {
    sayHello : function(name) {
      return "Hi " + name + "!";
    }
  }
});

সরবরাহের বিষয়ে এই উপস্থাপনাটি দেখুন: http://slides.wesalvaro.com/20121113/#/

এই স্লাইডগুলি অ্যাঙ্গুলারজেসের একটিতে ব্যবহার করা হয়েছিল: http://blog.angularjs.org/2012/11/more-angularjs-meetup-videos.html


13
এছাড়াও স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 15666048/… দেখুন যা পরিষেবা, কারখানা এবং সরবরাহের মধ্যে পার্থক্য নিয়ে আলোচনা করে।
রাজকোককে

31
সরকারী ডক পরোক্ষভাবে [sic! পরিষ্কার ধারণা করা হয়নি] বোঝানো হয়েছে যে আপনি যদি কারখানার সাথে পরিষেবাটি সংজ্ঞায়িত করেন তবে এটি একবারে তৈরি হয়েছিল। অন্য কথায় এটি পুনরায় উল্লেখ হিসাবে তৈরি করা হয়নি (ইনজেকশন পয়েন্ট) - আপনি যাকে বলে তা। উভয় উপায় ইনজেক্টর প্রতি একক ঘটনা ঘটায়।
হনজাজদে

3
আপনি বলছেন "পরিষেবা কেবল একটি নির্মাণকারী ফাংশন যা 'নতুন' দিয়ে ডাকা হবে" তবে আমি মনে করি এটি বিভ্রান্তিকর। আমি মনে করি না যে এটিকে পর্দার আড়ালে নতুন করে ডাকা হয়েছে, আমি মনে করি বিকাশকারী এটি কল করার জন্য দায়বদ্ধ new
টিম কিন্ডবার্গ

5
@ এনফিনিটেলুপ, ৩৫৪৪ লাইনের নিকটবর্তী উত্স কোডটি পরীক্ষা করুন act কারখানাগুলি সরবরাহকারীর $ পদ্ধতি পান, এবং পরিষেবাগুলি এমন পদ্ধতি ব্যবহার করে কারখানা তৈরি করে calls প্রদত্ত ফাংশনটিতে ject ইনজেক্টর.ইনস্ট্যানিয়েট কল করে, যা পরে নতুন কল করে। ( দস্তাবেজগুলি দেখুন )
নাগরিকরা

14
আমি এই ধারণাটির মধ্যে ছিলাম যে কোনও পরিষেবাটি সিঙ্গেলটন হিসাবে এটির রেফারেন্স পেয়ে আপনি ব্যবহার করেছেন। এবং এটি একটি ফ্যাক্টরি ছিল সিঙ্গলটন যা প্রতিটি সময় নতুন বস্তু ফেরত দেয়। অর্থাৎ কোনও পরিষেবা আপনাকে একটি "গাড়ি" দেবে এবং আপনার প্রকল্পের সমস্ত কিছু এই গাড়িটি ব্যবহার করবে। আপনি যখন কারখানাটি প্রতিবার চালু করেছিলেন তখন কোনও কারখানা আপনাকে একটি নতুন গাড়ি দেয়। একটি ছিল সিঙ্গলটন যা একটি সিঙ্গলটন ফিরিয়েছিল এবং একটি ছিল সিঙ্গলটন যা কোনও বস্তু ফেরত দেয়। কেউ কি ব্যাখ্যা করতে পারেন? একককে সমস্ত কিছু কল করা কার্যকর হয় না কারণ এটি একাধিক জিনিসের উল্লেখ করতে পারে to
ব্যবহারকারী 2483724

380

আমার জন্য ওহী এসেছিল যখন আমি বুঝতে পারি যে তারা সবাই একইভাবে কাজ করে: একবার কিছু চালিয়ে , তারা যে মূল্য পায় তা সঞ্চয় করে এবং তারপরে নির্ভরতা ইনজেকশনের মাধ্যমে রেফারেন্স করা হলে একই স্টোরেজ মানটি কাশি করে ।

বলুন আমাদের আছে:

app.factory('a', fn);
app.service('b', fn);
app.provider('c', fn);

তিনটির মধ্যে পার্থক্য হ'ল:

  1. aএর সঞ্চিত মান চলমান থেকে আসে fn, অন্য কথায়:fn()
  2. bএর সঞ্চিত মান আসে new আইংfn , অন্য কথায়:new fn()
  3. cএর সঞ্চিত মানটি প্রথমে উদাহরণ পেয়ে আসে new আইএনএন দিয়েfn এবং তারপরে $getউদাহরণটির কোনও পদ্ধতি চালানো

যার অর্থ, কৌণিকের ভিতরে ক্যাশ অবজেক্টের মতো কিছু রয়েছে, যার প্রতিটি ইনজেকশনের মান কেবল একবার নির্ধারিত হয়, যখন তারা প্রথমবার ইনজেকশন দেওয়া হয়েছিল এবং কোথায়:

cache.a = fn()
cache.b = new fn()
cache.c = (new fn()).$get()

এই কারণেই আমরা ব্যবহার করি this পরিষেবাগুলিতে এবং একটি this.$getসরবরাহকারীকে সংজ্ঞায়িত করি ।

আশাকরি এটা সাহায্য করবে.


54
অবশেষে, একটি বুদ্ধিমান ব্যাখ্যা। কৌণিক উন্মাদ এবং এতোটাই খারাপ যে এটি ব্যাথা করে।
ওসিরিস

8
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত কারণ এটি হ'ল ফ্যাক্টরি, পরিষেবা এবং সরবরাহকারীরা সিঙ্গেলটন মূল্য ফেরত দেয় answers অন্যান্য উত্তর কারখানা, পরিষেবা এবং সরবরাহকারীদের মধ্যে পার্থক্য ব্যাখ্যা করে তবে কখনও সিঙ্গলটনের দিকটি স্পর্শ করে না।
wmock

3
আমি এটি পছন্দ করি ... যখন আমি অন্য ব্লগার থেকে বাক্যটির হাজারটি লাইন পড়ি .. আমি কেবল কারখানাটি বুঝতে পারি। তবে আমি এটি পড়েছি ... আমি সমস্ত 3 বুঝতে পেরেছি
tsohtan

@osiris আমি সম্মত আমি এটা পছন্দ করি না। এটি কেবল এত ঘন ঘন ঘন ঘন ঘন ঘন স্বাচ্ছন্দ্য বোধ করে যে এটি আমার দাঁতগুলিকে পিষে তোলে।
থমাস

2
সুতরাং আপনাকে অবশ্যই সরবরাহকারী ব্যবহার করার সময় $ get এর একটি বাস্তবায়ন সরবরাহ করতে হবে?
ভিক্টর

95

সরাসরি উদাহরণ

"হ্যালো ওয়ার্ল্ড" উদাহরণ

সাথে factory/ service/ provider:

var myApp = angular.module('myApp', []);

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!"
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!"
        }
    };
});

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {
    // In the provider function, you cannot inject any
    // service or factory. This can only be done at the
    // "$get" method.

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!"
            }
        }
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}​

57

কনস্ট্রাক্টর ফাংশন ফিরিয়ে দেওয়ারও একটি উপায় রয়েছে যাতে আপনি কারখানায় নতুন করে ক্লাস ফিরিয়ে দিতে পারেন :

function MyObjectWithParam($rootScope, name) {
  this.$rootScope = $rootScope;
  this.name = name;
}
MyObjectWithParam.prototype.getText = function () {
  return this.name;
};

App.factory('MyObjectWithParam', function ($injector) {
  return function(name) { 
    return $injector.instantiate(MyObjectWithParam,{ name: name });
  };
}); 

সুতরাং আপনি এটি নিয়ন্ত্রণকারীতে করতে পারেন, যা মাইবজেক্টবিথপ্যারাম ব্যবহার করে:

var obj = new MyObjectWithParam("hello"),

এখানে সম্পূর্ণ উদাহরণ দেখুন:
http://plnkr.co/edit/GKnhIN?p= পূর্বরূপ

এবং এখানে গুগল গ্রুপের পৃষ্ঠা, যেখানে এটি আলোচনা করা হয়েছিল:
https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ


আপনার উদাহরণটি ব্যবহার করে আমি মিনিফিকেশন নিয়ে সমস্যা করছি। আপনি কি জানেন যে এটি আমার কীভাবে বারণ করা উচিত?
পোল

2
হ্যাঁ, কৌণিকের জন্য এখানে একটি সংক্ষিপ্ত বিবরণ রয়েছে। এটি এর মতো কিছু হওয়া উচিত: App.factory('MyObjectWithParam', ['$injector', function ($injector) { return function(name) { return $injector.instantiate(MyObjectWithParam,{ name: name }); }; }]); এটি সম্পর্কে এখানে আরও পড়ুন: ডকস.আঙ্গুলারজেএস.আর
টিউটোরিয়াল

4
আপনি যদি এটি ব্যবহার করতে চান তবে কেন আপনি এটি করতে চান .service?
6'15 ফ্ল্যাট

আমারও একই চিন্তা ছিল @ ফ্লুপ। @ समायোগোসচা, এর বিপরীতে ব্যবহার করার কিছু সুবিধা আছে ( অনুধাবন? ) ? .factory.service
xandercoded

5
আমি মনে করি কারণ একটি পরিষেবা একটি সিঙ্গলটন । আমি এখানে যা নির্মাণ করেছি তা মূলত একটি বর্গ যা নতুনযোগ্য। আপনি একটি গাড়ী সেবা কারখানা মত কিছু আছে এবং তারপর পারেন তাই করতে new Car('BMW')এবং new Car('Ford')এবং তারা একই ভেরিয়েবল এবং সবকিছু শেয়ার করে না।
জাস্টগোসচা 20'15

51

এখানে প্রাথমিক পার্থক্য রয়েছে:

সেবা

বাক্য গঠন: module.service( 'serviceName', function );

ফলাফল: পরিষেবা নাম যখন ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে কোনও ফাংশনটি পাস করার উদাহরণ সরবরাহ করা হবেmodule.service

ব্যবহার: কেবলমাত্র ইনজেকশনের ফাংশন রেফারেন্সে () যুক্ত করে অনুরোধ করতে দরকারী এমন ইউটিলিটি ফাংশনগুলি ভাগ করে নেওয়ার জন্য দরকারী হতে পারে । সঙ্গে injectedArg.call( this )বা অনুরূপ চালানো যেতে পারে ।

কারখানা

বাক্য গঠন: module.factory( 'factoryName', function );

ফলাফল: যখন ইঞ্জেকশনভিত্তিক একটা যুক্তি আপনি প্রদান করা হবে যেমন factoryName ঘোষণা মান ফাংশন রেফারেন্স আবাহন করার মাধ্যমে ফিরিয়ে দেওয়া হয় প্রেরণ module.factory

ব্যবহার: উদাহরণস্বরূপ তৈরি করতে নতুন করা যেতে পারে এমন কোনও 'শ্রেণি' ফাংশন ফেরত দেওয়ার জন্য দরকারী হতে পারে।

পরিষেবা বনাম কারখানা সম্পর্কে বিভ্রান্ত স্ট্যাকওভারফ্লোতে অ্যাংুলারজেএস ডকুমেন্টেশন এবং অনুরূপ প্রশ্নও পরীক্ষা করে দেখুন

এখানে পরিষেবা এবং কারখানা ব্যবহার করে উদাহরণ দেওয়া আছেAngularJS পরিষেবা বনাম কারখানা সম্পর্কে আরও পড়ুন ।


6
এটি আমার কাছে বোধগম্য হয়। তিনি ফ্যাক্টরি নতুন বস্তু তৈরির জন্য নীলনকশাটি প্রদান করে।

27

প্রথম উত্তরের সাথে যুক্ত করে, আমার মনে হয় .service () এমন লোকদের জন্য যারা তাদের কোডটি আরও অবজেক্ট ওরিয়েন্টেড স্টাইলে (সি # / জাভা) লিখেছেন (এই কীওয়ার্ডটি ব্যবহার করে এবং প্রোটোটাইপ / কনস্ট্রাক্টর ফাংশনের মাধ্যমে অবজেক্টটি ইনস্ট্যান্ট করছে)।

কারখানাটি এমন বিকাশকারীদের জন্য যারা কোড লেখেন যা জাভাস্ক্রিপ্ট / কোডিংয়ের কার্যকরী শৈলীর চেয়ে বেশি স্বাভাবিক।

কৌণিক.জেএস এর অভ্যন্তরে। পরিষেবা এবং কারখানা পদ্ধতির উত্স কোডটি একবার দেখুন - অভ্যন্তরীণভাবে তারা সকলেই কল সরবরাহকারী পদ্ধতিতে:

  function provider(name, provider_) {
    if (isFunction(provider_)) {
      provider_ = providerInjector.instantiate(provider_);
    }
    if (!provider_.$get) {
      throw Error('Provider ' + name + ' must define $get factory method.');
    }
    return providerCache[name + providerSuffix] = provider_;
  }

  function factory(name, factoryFn) { \
    return provider(name, { $get: factoryFn }); 
  }

  function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
      return $injector.instantiate(constructor);
    }]);
  }

25

খুব সহজ:

.service - নিবন্ধিত ফাংশনটি কনস্ট্রাক্টর হিসাবে ডাকা হবে (ওরফে 'নতুন')

ফ্যাক্টরি - নিবন্ধিত ফাংশনটিকে একটি সাধারণ ফাংশন হিসাবে ডাকা হবে

দু'জনেই একবার অনুরোধ জানানো হয় যার ফলে আপনার অ্যাপ্লিকেশনের অন্যান্য উপাদানগুলিতে ইনজেকশন পাওয়া সিঙ্গলটন অবজেক্ট হয়।


6
হ্যাঁ. আসুন না কিছু আরও জটিল চেয়ে সত্যিই তারা করতে
flup

20

সমস্ত সরবরাহকারী একইভাবে কাজ করে। বিভিন্ন পদ্ধতি service, factory, providerশুধু আপনার কম কোডে একই জিনিস সাধা যাক।

পিএসও আছে valueএবং constant

শৃঙ্খলা থেকে শুরু করে providerশেষ হওয়া প্রতিটি বিশেষ ক্ষেত্রে valueএকটি অতিরিক্ত সীমাবদ্ধতা রয়েছে। সুতরাং তাদের মধ্যে সিদ্ধান্ত নেওয়ার জন্য আপনাকে নিজেকে জিজ্ঞাসা করতে হবে যে কম কোড দিয়ে আপনি যা চান তা পূরণ করুন।

এখানে একটি ছবি যা আপনাকে বোঝায় যে আমি কী বোঝাতে চাইছি:

এখানে চিত্র বর্ণনা লিখুন

আপনি ব্লগ পোস্টে একটি ব্রেকডাউন এবং রেফারেন্স গাইড করতে পারেন এই চিত্রটি থেকে:

http://www.simplygoodcode.com/2015/11/the-difference-between-service-provider-and-factory-in-angularjs/


পরিষেবাদিগুলিকে সিঙ্গেলটন বলা হয়, তবে কীভাবে এটি সিঙ্গেলটন আসবে, যদি প্রতিবার নতুন ইনজ্যাকশন তৈরি করা হয় তবে?
অঙ্কুর মারওয়াহা

1
@ আঙ্কুরমারওয়াহা প্রতিবার একটি নতুন উদাহরণ তৈরি করা হয় না, এটি কেবল একবার তৈরি করা হয় এবং অ্যাংুলারজেএস দ্বারা ক্যাশে করা হয়। আপনি কোনও সরবরাহকারী, কারখানা, পরিষেবা ইত্যাদি ব্যবহার করছেন কিনা তা সত্য, আপনি console.log()একাধিক নিয়ামক ব্যবহার করে এবং ইনজেকশন দিয়ে এটি নিশ্চিত করতে পারেন ।
লুইস পেরেজ

লুইস, আপনার মন্তব্য গৃহীত উত্তরের সাথে সাংঘর্ষিক কারণ এটি বলছে - শেষ পর্যন্ত, এটি উপলব্ধি করা গুরুত্বপূর্ণ যে সমস্ত কৌণিক পরিষেবাগুলি অ্যাপ্লিকেশন সিঙ্গেলন। এর অর্থ ইনজেক্টর প্রতি প্রদত্ত পরিষেবার কেবলমাত্র একটি উদাহরণ রয়েছে।
অঙ্কুর মারওয়াহা

@ অঙ্কুরমারওয়াহা হয়ত আমি কিছু ভুল বুঝছি। আপনি উদ্ধৃত করেছেন "এটি উপলব্ধি করা গুরুত্বপূর্ণ যে সমস্ত কৌণিক পরিষেবাগুলি অ্যাপ্লিকেশন সিঙ্গেলটন" - এগুলি সত্য যে এটি সিঙ্গেলটন মানে তারা কেবল একবার তৈরি হয়েছিল। আমি যা বলেছিলাম " প্রতিবার একটি নতুন উদাহরণ তৈরি করা হয় না , এটি কেবল একবার তৈরি এবং ক্যাশে ..."। আপনি সংঘাতটি দেখতে পাচ্ছেন এমন কি আরও বিশদে নির্দেশ করতে পারেন?
লুইস পেরেজ

1
আহ, আমি বিভ্রান্তি দেখছি। "ইনজেক্টর" কৌণিক একটি বস্তু। এটি "ইনজেকশন" করার দায়িত্বে রয়েছে। উদাহরণস্বরূপ, যখন কন্ট্রোলার প্রথমে চালিত হয় তখন "ইনজেক্টর" প্যারামিটারগুলি দেখে এবং প্রতিটিকে ইনজেকশন দেয়। আপনার পুরো অ্যাপ্লিকেশনটির জন্য কেবল একটি "ইনজেক্টর" রয়েছে। একবার ইনজেক্টর কোনও নির্দিষ্ট কারখানা বা পরিষেবা তৈরি করে এটি এটিতে একটি উদাহরণ রাখে এবং এটি পুনরায় ব্যবহার করে - তাই সিঙ্গলটন। সুতরাং প্রতি অ্যাপ্লিকেশনটিতে কেবল একটি ইনজেক্টর এবং প্রতি ইনজেক্টর প্রদত্ত পরিষেবার কেবল একটি উদাহরণ রয়েছে। সর্বাধিক কৌণিক অ্যাপ্লিকেশন শুধুমাত্র একটি অ্যাপ্লিকেশন, তাই এক প্রবেশক, কোনো সেবার তাই এক উদাহরণস্বরূপ, নিয়ামক, ইত্যাদি আছে
লুইস পেরেজ

13

এখানে পরিষেবাদি বনাম কারখানাগুলির আরও কয়েকটি উদাহরণ রয়েছে যা তাদের মধ্যে পার্থক্যটি দেখতে কার্যকর হতে পারে। মূলত, একটি পরিষেবাতে "নতুন ..." ডেকেছে এটি ইতিমধ্যে তাত্ক্ষণিকভাবে রয়েছে। একটি কারখানা স্বয়ংক্রিয়ভাবে ইনস্ট্যান্ট হয় না।

বেসিক উদাহরণ

একটি ক্লাস অবজেক্টটি ফিরিয়ে দিন যার একক পদ্ধতি রয়েছে

এখানে একটি পরিষেবা রয়েছে যার একটি একক পদ্ধতি রয়েছে:

angular.service('Hello', function () {
  this.sayHello = function () { /* ... */ };
});

এখানে এমন একটি ফ্যাক্টরি যা কোনও পদ্ধতির সাহায্যে কোনও বস্তুকে ফেরত দেয়:

angular.factory('ClassFactory', function () {
  return {
    sayHello: function () { /* ... */ }
  };
});

একটি মান ফেরত দিন

একটি কারখানা যা সংখ্যার একটি তালিকা ফেরত দেয়:

angular.factory('NumberListFactory', function () {
  return [1, 2, 3, 4, 5];
});

console.log(NumberListFactory);

একটি পরিষেবা যা সংখ্যার একটি তালিকা ফেরত দেয়:

angular.service('NumberLister', function () {
  this.numbers = [1, 2, 3, 4, 5];
});

console.log(NumberLister.numbers);

উভয় ক্ষেত্রেই আউটপুট একই, সংখ্যার তালিকা।

উন্নত উদাহরণ

কারখানাগুলি ব্যবহার করে "শ্রেণি" ভেরিয়েবল

এই উদাহরণে আমরা একটি কাউন্টারফ্যাক্টরি সংজ্ঞায়িত করি, এটি কাউন্টারকে বাড়িয়ে দেয় বা হ্রাস করে এবং আপনি বর্তমান গণনা পেতে পারেন বা কতটা কাউন্টারফ্যাক্টরি অবজেক্ট তৈরি করা হয়েছে তা পেতে পারেন:

angular.factory('CounterFactory', function () {
  var number_of_counter_factories = 0; // class variable

  return function () {
    var count = 0; // instance variable
    number_of_counter_factories += 1; // increment the class variable

    // this method accesses the class variable
    this.getNumberOfCounterFactories = function () {
      return number_of_counter_factories;
    };

    this.inc = function () {
      count += 1;
    };
    this.dec = function () {
      count -= 1;
    };
    this.getCount = function () {
      return count;
    };
  }

})

আমরা CounterFactoryএকাধিক কাউন্টার তৈরি করতে ব্যবহার করি । কতগুলি কাউন্টার তৈরি হয়েছিল তা দেখতে আমরা শ্রেণি ভেরিয়েবলটি অ্যাক্সেস করতে পারি:

var people_counter;
var places_counter;

people_counter = new CounterFactory();
console.log('people', people_counter.getCount());
people_counter.inc();
console.log('people', people_counter.getCount());

console.log('counters', people_counter.getNumberOfCounterFactories());

places_counter = new CounterFactory();
console.log('places', places_counter.getCount());

console.log('counters', people_counter.getNumberOfCounterFactories());
console.log('counters', places_counter.getNumberOfCounterFactories());

এই কোডের আউটপুট হল:

people 0
people 1
counters 1
places 0
counters 2
counters 2

এটি একটি দরকারী উদাহরণ, নাম্বার_ফেসার্টস_ফ্যাক্টরিগুলি কাউন্টারফ্যাক্টরি ক্লাসের মেটা অ্যাট্রিবিউটের মতো, তাই না?
জুম

দরকারী উদাহরণ! সুতরাং এর মূলত এর অর্থ হল একটি কারখানায় আপনার বিমূর্ততার অতিরিক্ত স্তর থাকতে পারে যা কোনও পরিষেবাতে পাবেন না। যাইহোক যাইহোক ফেরত আসুক না কেন, যখনই 'নতুন' ব্যবহার করা হয় তখন এর নতুন উদাহরণ ফিরে আসবে। রিটার্ন ব্লকের ভিতরে ঘোষিত না হওয়া কোনও ভেরিয়েবল সিঙ্গলটন হবে। আমি কি ঠিক পেয়েছি?
স্বনিধি

@ স্বনিধি মূলত হ্যাঁ, আপনি কারখানায় ভেরিয়েবলগুলি সিঙ্গেলন হিসাবে ঘোষণা করতে পারেন। সে কারণেই আমি তাদের "শ্রেণি" ভেরিয়েবল বলেছি।

13

"কারখানা" এবং "পরিষেবা" কৌণিকভাবে ডিআই (নির্ভরতা ইনজেকশন) করার বিভিন্ন উপায়।

সুতরাং যখন আমরা নীচের কোডে দেখানো হিসাবে "পরিষেবা" ব্যবহার করে ডিআই সংজ্ঞায়িত করি। এটি "লগার" অবজেক্টের একটি নতুন গ্লোবাল উদাহরণ তৈরি করে এবং এটি ফাংশনে ইনজেক্ট করে।

app.service("Logger", Logger); // Injects a global object

আপনি যখন "ফ্যাক্টরি" ব্যবহার করে ডিআই সংজ্ঞায়িত করেন এটি কোনও উদাহরণ তৈরি করে না। এটি কেবল পদ্ধতিটি পাস করে এবং পরে গ্রাহককে অভ্যন্তরীণভাবে কারখানায় বস্তুর উদাহরণগুলির জন্য কল করতে হয়।

app.factory("Customerfactory", CreateCustomer);

নীচে একটি সাধারণ চিত্র রয়েছে যা "পরিষেবা" এর জন্য ডিআই প্রক্রিয়াটি "কারখানার" থেকে আলাদা কীভাবে দৃশ্যমান তা দেখায়।

এখানে চিত্র বর্ণনা লিখুন

কারখানাটি ব্যবহার করা উচিত যখন আমরা পরিস্থিতিগুলির উপর নির্ভর করে বিভিন্ন ধরণের অবজেক্ট তৈরি করতে চাই। উদাহরণস্বরূপ দৃশ্যের উপর নির্ভর করে আমরা একটি সাধারণ "গ্রাহক" অবজেক্ট তৈরি করতে চাই, বা "ঠিকানা" অবজেক্ট সহ "গ্রাহক" বা "ফোন" অবজেক্ট সহ "গ্রাহক"। এই অনুচ্ছেদের একটি বিশদ ব্যাখ্যা এখানে

পরিষেবাটি ব্যবহার করা উচিত যখন আমাদের ইউটিলিটি বা ভাগ করা ফাংশনগুলি ইনজেকশনের মতো ইউটিলিটি, লগার, ত্রুটি হ্যান্ডলার ইত্যাদি have


আমি এই প্রশ্নে এবং অন্যান্য অনুরূপ অন্যান্য প্রত্যেক উত্তর উত্তর পেয়েছি যান্ত্রিক এবং বাক্য গঠনের পার্থক্য নির্দিষ্ট করে। এই উত্তরটি কেন আপনি একে অপরকে বেছে নেবেন তা আসল কারণ দেয়। এটি শব্দার্থবিজ্ঞানের বিষয় এবং নাম, পরিষেবা বা কারখানার দিকে তাকানো তাদের উদ্দেশ্য এবং কীভাবে তারা ব্যবহার হচ্ছে তা যোগাযোগ করে।
জো মায়ো

8

পরিষেবা শৈলী: ( সম্ভবত সবচেয়ে সহজ ) আসল ফাংশনটি ফিরিয়ে দেয়: কেবলমাত্র ইনজেকশনের ফাংশন রেফারেন্সে () সংযোজন করে অনুরোধ করতে দরকারী এমন ইউটিলিটি ফাংশনগুলি ভাগ করে নেওয়ার জন্য দরকারী Use

অ্যাঙ্গুলারজেএস-এ একটি পরিষেবা হ'ল একটি সিঙ্গলটন জাভাস্ক্রিপ্ট অবজেক্ট যা ফাংশনের একটি সেট রয়েছে set

var myModule = angular.module("myModule", []);

myModule.value  ("myValue"  , "12345");

function MyService(myValue) {
    this.doIt = function() {
        console.log("done: " + myValue;
    }
}

myModule.service("myService", MyService);
myModule.controller("MyController", function($scope, myService) {

    myService.doIt();

});

কারখানার শৈলী: ( আরও জড়িত তবে আরও পরিশীলিত ) ফাংশনটির রিটার্ন মান প্রদান করে: জাভাতে নতুন অবজেক্টের মতো কোনও বস্তুর ইনস্ট্যান্ট করুন ()।

কারখানা একটি ফাংশন যা মান তৈরি করে। যখন কোনও পরিষেবা, নিয়ন্ত্রক ইত্যাদির কোনও কারখানা থেকে ইনজেকশনের মান প্রয়োজন হয় তখন কারখানাটি চাহিদা অনুযায়ী মান তৈরি করে। একবার তৈরি হয়ে গেলে মানটি সমস্ত পরিষেবা, নিয়ন্ত্রণকারী ইত্যাদির জন্য পুনরায় ব্যবহার করা হয় যার জন্য এটির প্রয়োজন হয়।

var myModule = angular.module("myModule", []);

myModule.value("numberValue", 999);

myModule.factory("myFactory", function(numberValue) {
    return "a value: " + numberValue;
})  
myModule.controller("MyController", function($scope, myFactory) {

    console.log(myFactory);

});

সরবরাহকারী শৈলী: ( সম্পূর্ণরূপে প্রসারণযোগ্য, কনফিগারযোগ্য সংস্করণ) ) ফাংশনের function get ফাংশন: কনফিগারযোগ্য আউটপুট প্রদান করে।

অ্যাঙ্গুলারজেএস সরবরাহকারীরা আপনার তৈরি কারখানার সবচেয়ে নমনীয় ফর্ম। আপনি পরিবর্তে সরবরাহকারী () ফাংশনটি ব্যবহার না করে আপনি কোনও পরিষেবা বা কারখানার সাথে যেমন করেন ঠিক তেমন কোনও মডিউল দিয়ে কোনও সরবরাহকারীকে নিবন্ধভুক্ত করেন।

var myModule = angular.module("myModule", []);

myModule.provider("mySecondService", function() {
    var provider = {};
    var config   = { configParam : "default" };

    provider.doConfig = function(configParam) {
        config.configParam = configParam;
    }

    provider.$get = function() {
        var service = {};

        service.doService = function() {
            console.log("mySecondService: " + config.configParam);
        }

        return service;
    }

    return provider;
});

myModule.config( function( mySecondServiceProvider ) {
    mySecondServiceProvider.doConfig("new config param");
});

myModule.controller("MyController", function($scope, mySecondService) {

    $scope.whenButtonClicked = function() {
        mySecondService.doIt();
    }

});

src জেনকোভ

<!DOCTYPE html>
    <html ng-app="app">
    <head>
    	<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.min.js"></script>
    	<meta charset=utf-8 />
    	<title>JS Bin</title>
    </head>
    <body ng-controller="MyCtrl">
    	{{serviceOutput}}
    	<br/><br/>
    	{{factoryOutput}}
    	<br/><br/>
    	{{providerOutput}}
    
    	<script>
    
    		var app = angular.module( 'app', [] );
    
    		var MyFunc = function() {
    
    			this.name = "default name";
    
    			this.$get = function() {
    				this.name = "new name"
    				return "Hello from MyFunc.$get(). this.name = " + this.name;
    			};
    
    			return "Hello from MyFunc(). this.name = " + this.name;
    		};
    
    		// returns the actual function
    		app.service( 'myService', MyFunc );
    
    		// returns the function's return value
    		app.factory( 'myFactory', MyFunc );
    
    		// returns the output of the function's $get function
    		app.provider( 'myProv', MyFunc );
    
    		function MyCtrl( $scope, myService, myFactory, myProv ) {
    
    			$scope.serviceOutput = "myService = " + myService;
    			$scope.factoryOutput = "myFactory = " + myFactory;
    			$scope.providerOutput = "myProvider = " + myProv;
    
    		}
    
    	</script>
    
    </body>
    </html>

jsbin

<!DOCTYPE html>
<html ng-app="myApp">
<head>
	<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.1/angular.min.js"></script>
	<meta charset=utf-8 />
	<title>JS Bin</title>
</head>
<body>
<div ng-controller="MyCtrl">
    {{hellos}}
</div>
	<script>

	var myApp = angular.module('myApp', []);

//service style, probably the simplest one
myApp.service('helloWorldFromService', function() {
    this.sayHello = function() {
        return "Hello, World!"
    };
});

//factory style, more involved but more sophisticated
myApp.factory('helloWorldFromFactory', function() {
    return {
        sayHello: function() {
            return "Hello, World!"
        }
    };
});
    
//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!"
            }
        }
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});
        

function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {
    
    $scope.hellos = [
        helloWorld.sayHello(),
        helloWorldFromFactory.sayHello(),
        helloWorldFromService.sayHello()];
}
	</script>

</body>
</html>

jsfiddle


2

মূল পার্থক্য, এটি হ'ল সরবরাহকারী আদিম (অ-অবজেক্টস), অ্যারে, বা কলব্যাক ফাংশন মানগুলি কারখানায় ঘোষিত ভেরিয়েবলের মধ্যে সেট করতে দেয় এবং এভাবে কোনও জিনিস ফেরত দেওয়া হলে তা স্পষ্টভাবে ঘোষণা করা এবং ফিরে আসতে হবে।

অন্যদিকে পরিষেবাটি কেবলমাত্র কোনও সামগ্রীর কাছে পরিবর্তনশীল হিসাবে ঘোষিত পরিষেবাটি সেট করতে ব্যবহার করা যেতে পারে, সুতরাং আমরা স্পষ্টভাবে সৃষ্টি এবং অবজেক্টগুলিকে ফিরিয়ে এড়াতে পারি, অন্যদিকে এটি এই কীওয়ার্ডটি ব্যবহারের অনুমতি দেয় ।

বা সংক্ষেপে কথায় কথায় " সরবরাহকারী একটি আরও সাধারণ ফর্ম যখন পরিষেবা কেবলমাত্র বস্তুর মধ্যে সীমাবদ্ধ থাকে"।


2

ডিজাইনের ধরণগুলির ক্ষেত্রে আমি এইভাবে তাদের মধ্যে পার্থক্যটি বুঝতে পেরেছি:

পরিষেবা : একটি প্রকারটি ফেরত দিন, এটি সেই ধরণের একটি অবজেক্ট তৈরি করতে নতুন হবে। যদি জাভা সাদৃশ্য ব্যবহৃত হয় তবে পরিষেবাটি জাভা শ্রেণির সংজ্ঞা প্রদান করে

কারখানা : একটি কংক্রিট অবজেক্ট ফেরত দেয় যা তাত্ক্ষণিকভাবে ব্যবহৃত হতে পারে। জাভা অ্যানালগিতে একটি কারখানা একটি জাভা অবজেক্ট দেয়

লোকেরা প্রায়শই আমাকে বিভ্রান্ত করে তোলে (নিজেকে সহ) আপনি যখন আপনার কোডটিতে কোনও পরিষেবা বা কারখানার ইনজেক্ট করেন তখন সেগুলি একইভাবে ব্যবহার করা যেতে পারে, উভয় ক্ষেত্রেই আপনার কোডটিতে আপনি যা পান তা হ'ল একটি কংক্রিট অবজেক্ট যা আপনি অবিলম্বে আবেদন করতে পারেন। যার অর্থ পরিষেবার ক্ষেত্রে, কৌণিক আপনার পক্ষ থেকে পরিষেবা ঘোষণায় "নতুন" কল করে। আমি মনে করি এটি একটি বিভ্রান্ত ধারণা।


1

পরিষেবা বনাম কারখানা বনাম সরবরাহকারী বোঝার জন্য এটি সেরা এবং সংক্ষিপ্ত উত্তর হবে

সূত্র : https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/HuZsOsMvKv4J

এখানে বেন একটি ডেমো দিয়ে কী বলে http://jsbin.com/ohamub/1/edit?html, আউটপুট

"প্রাথমিক পার্থক্যের চিত্রিত কোডটিতে মন্তব্য রয়েছে তবে আমি তাদের সম্পর্কে এখানে কিছুটা প্রসারিত করব a নোট হিসাবে, আমি আমার মাথাটি কেবল এদিকেই নিয়ে যাচ্ছি যদি আমি ভুল কিছু বলি তবে দয়া করে আমাকে জানান।

সেবা

বাক্য গঠন : মডিউল.সার্ভিস ('সার্ভিসনাম', ফাংশন);

ফলাফল : সার্ভিসনামকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে মডিউল.সেয়ারসে পাস করা আসল ফাংশন রেফারেন্স সরবরাহ করা হবে।

ব্যবহার : কেবলমাত্র ইনজেকশনের ফাংশন রেফারেন্সে () যুক্ত করে অনুরোধ করতে দরকারী এমন ইউটিলিটি ফাংশনগুলি ভাগ করে নেওয়ার জন্য দরকারী হতে পারে। ইনজেক্টেডআর্গ.কল (এটি) বা অনুরূপ দিয়েও চালানো যেতে পারে।

কারখানা

সিনট্যাক্স : মডিউল.ফ্যাক্টরি ('কারখানার নাম', ফাংশন);

ফলাফল : ফ্যাক্টরিনামকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে সেই মান সরবরাহ করা হবে যা ফাংশন রেফারেন্সটি মডিউল.ফ্যাক্টরিতে পাস করে ফিরে আসবে।

ব্যবহার : উদাহরণস্বরূপ তৈরি করতে নতুন করা যেতে পারে এমন কোনও 'শ্রেণি' ফাংশন ফেরত দেওয়ার জন্য দরকারী হতে পারে।

প্রোভাইডার

বাক্য গঠন : মডিউল.প্রভাইডার ('প্রোভাইডারনেম', ফাংশন);

ফলাফল : যখন প্রদত্ত নামকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে সেই মান সরবরাহ করা হবে যা মডিউল.প্রভাইডারে পাস করা ফাংশন রেফারেন্সের পদ্ধতিটি গ্রহণ করে অনুরোধ করে ফেরত দেওয়া হয়।

ব্যবহার : কোনও 'শ্রেণি' ফাংশন ফিরিয়ে দেওয়ার জন্য দরকারী হতে পারে যা উদাহরণ তৈরি করতে নতুন করা যেতে পারে তবে এর জন্য ইনজেকশনের আগে কিছুটা কনফিগারেশন প্রয়োজন। প্রকল্পগুলিতে পুনরায় ব্যবহারযোগ্য ক্লাসগুলির জন্য সম্ভবত দরকারী? এখনও এই এক ধরণের ধোঁয়াশা। "বেন


1

আমার কিছুক্ষণের জন্য এই বিভ্রান্তি ছিল এবং আমি এখানে একটি সহজ ব্যাখ্যা দেওয়ার জন্য যথাসাধ্য চেষ্টা করছি। আশা করি এটি সাহায্য করবে!

angular .factoryএবং angular .serviceউভয়ই কোনও পরিষেবা আরম্ভ করতে এবং একইভাবে কাজ করতে ব্যবহৃত হয়।

পার্থক্যটি হল, আপনি কীভাবে আপনার পরিষেবাটি শুরু করতে চান।

দুজনই সিঙ্গলেটন


var app = angular.module('app', []);


কারখানা

অ্যাপ.ফ্যাক্টরি ( <service name>, <function with a return value>)

আপনি যদি কোনও রিটার্ন মান সহ কোনও ফাংশন থেকে আপনার পরিষেবাটি শুরু করতে চান তবে আপনাকে এই factoryপদ্ধতিটি ব্যবহার করতে হবে ।

যেমন

function myService() {
  //return what you want
  var service = {
    myfunc: function (param) { /* do stuff */ }
  }
  return service;
}

app.factory('myService', myService);

এই পরিষেবাটি ইনজেক্ট করার সময় (যেমন আপনার নিয়ামকের কাছে):

  • কৌনিকটি আপনার প্রদত্ত ফাংশনটিকে (যেমন ) কলmyService() করে বস্তুটি ফেরত দেবে
  • সিঙ্গলটন - কেবল একবার কল করা, সঞ্চয় এবং একই বস্তুটি পাস করুন।


সেবা

app.service ( <service name>, <constructor function>)

আপনি যদি কোনও কনস্ট্রাক্টর ফাংশন ( thisকীওয়ার্ড ব্যবহার করে ) থেকে আপনার পরিষেবাটি শুরু করতে চান তবে আপনাকে এই serviceপদ্ধতিটি ব্যবহার করতে হবে ।

যেমন

function myService() {
  this.myfunc: function (param) { /* do stuff */ }
}

app.service('myService', myService);

এই পরিষেবাটি ইনজেক্ট করার সময় (যেমন আপনার নিয়ামকের কাছে):

  • কৌণিক বস্তুটি ফেরত দেওয়ার জন্য newআপনার প্রদত্ত ক্রিয়াকলাপটি (যেমন new myService()) -র সাথে যুক্ত করবে
  • সিঙ্গলটন - কেবল একবার কল করা, সঞ্চয় এবং একই বস্তুটি পাস করুন।


দ্রষ্টব্য: আপনি যদি factoryসাথে <constructor function>বা serviceসাথে ব্যবহার করেন তবে <function with a return value>এটি কার্যকর হবে না।


উদাহরণ - ডেমো


1

এটিই আমাকে পার্থক্য বুঝতে সাহায্য করেছিল, পাস্কাল প্রেক্টের একটি ব্লগ পোস্টকে ধন্যবাদ।

একটি পরিষেবা একটি মডিউলের একটি পদ্ধতি যা নাম এবং একটি ফাংশন গ্রহণ করে যা পরিষেবাটি সংজ্ঞায়িত করে। আপনি নির্দিষ্ট উপাদানটিকে অন্য উপাদানগুলিতে যেমন কন্ট্রোলার, নির্দেশিকা এবং ফিল্টারগুলিতে ইনজেকশন এবং ব্যবহার করতে পারেন। একটি কারখানা একটি মডিউলে একটি পদ্ধতি এবং এটি একটি নাম এবং একটি ফাংশনও নেয় যা কারখানাকে সংজ্ঞায়িত করে। আমরা সার্ভিসের সাথে এটি একইভাবে ইনজেকশন এবং ব্যবহার করতে পারি।

নতুন তৈরি করা বস্তুগুলি তাদের নির্মাণকারীর ফাংশনটির প্রোটোটাইপ বৈশিষ্ট্যের মানকে তাদের প্রোটোটাইপ হিসাবে ব্যবহার করে, তাই আমি অ্যাঙ্গুলার কোডটি পেয়েছি যা অবজেক্ট.ক্রিয়েট () বলে calls যাইহোক, একটি ফ্যাক্টরি ফাংশন আসলেই কেবল একটি ফাংশন যা কল হয়ে যায়, এজন্য কারখানার জন্য আমাদের কোনও বস্তুর আক্ষরিক ফিরিয়ে দিতে হবে।

এখানে আমি কারখানার জন্য কৌনিক 1.5 কোড খুঁজে পেয়েছি:

var needsRecurse = false;
    var destination = copyType(source);

    if (destination === undefined) {
      destination = isArray(source) ? [] : Object.create(getPrototypeOf(source));
      needsRecurse = true;
    }

কারখানার () ফাংশনের জন্য কৌনিক উত্স কোড স্নিপেট:

 function factory(name, factoryFn, enforce) {
    return provider(name, {
      $get: enforce !== false ? enforceReturnValue(name, factoryFn) : factoryFn
    });
  }

এটি নাম এবং কারখানার ফাংশনটি নেয় যা উত্তীর্ণ হয় এবং একই নাম সহ কোনও সরবরাহকারীকে ফেরত দেয়, এতে একটি $ get পদ্ধতি রয়েছে যা আমাদের কারখানার ফাংশন। আপনি যখনই ইনজেক্টরকে একটি নির্দিষ্ট নির্ভরতার জন্য জিজ্ঞাসা করেন, এটি মূলত provider get () পদ্ধতিতে কল করে সংশ্লিষ্ট সরবরাহকারীকে সেই পরিষেবাটির একটি উদাহরণ জিজ্ঞাসা করে। এজন্য সরবরাহকারী তৈরি করার সময় $ get () প্রয়োজন।

পরিষেবার জন্য এখানে কৌনিক 1.5 কোড রয়েছে।

function service(name, constructor) {
    return factory(name, ['$injector', function($injector) {
      return $injector.instantiate(constructor);
    }]);
  }

দেখা যাচ্ছে যে যখন আমরা পরিষেবা () কল করি, তখন এটি আসলে ফ্যাক্টরি কল করে ()! যাইহোক, এটি কেবল আমাদের পরিষেবা কনস্ট্রাক্টর ফাংশনটি কারখানায় যেমন পাস করে না। এটি এমন একটি ফাংশনও পাস করে যা ইঞ্জেক্টরকে প্রদত্ত কন্সট্রাক্টরের দ্বারা কোনও বস্তু তাত্ক্ষণিক করতে বলে।

অন্য কথায়, আমরা যদি কোথাও মাই সার্ভিস ইনজেক্ট করি, কোডে যা ঘটে তা হ'ল:

MyServiceProvider.$get(); // return the instance of the service

এটি পুনরায় চালু করতে, একটি পরিষেবা একটি কারখানাকে কল করে, যা সংশ্লিষ্ট সরবরাহকারীর a get () পদ্ধতি। তদুপরি, $ injector.instantiate () হ'ল এমন পদ্ধতি যা শেষ পর্যন্ত কনস্ট্রাক্টর ফাংশন দিয়ে অবজেক্ট.ক্রিয়েট () বলে। এজন্য আমরা পরিষেবাগুলিতে "এটি" ব্যবহার করি।

ES5- র ক্ষেত্রে এটি ব্যবহার করা যায় না যা আমরা ব্যবহার করি: পরিষেবা () বা কারখানা (), এটি সর্বদা একটি ফ্যাক্টরি বলা হয় যা আমাদের পরিষেবার জন্য সরবরাহকারী তৈরি করে।

আপনি পাশাপাশি পরিষেবাগুলির সাথে একই জিনিসটি করতে পারেন। একটি পরিষেবাদি একটি কনস্ট্রাক্টর ফাংশন, তবে এটি আমাদের বস্তুর আক্ষরিক প্রত্যাবর্তন থেকে বাধা দেয় না। সুতরাং আমরা আমাদের পরিষেবা কোডটি নিতে পারি এবং এটি এমনভাবে লিখতে পারি যে এটি মূলত আমাদের কারখানার মতোই একই কাজটি করে বা অন্য কথায়, আপনি কোনও জিনিস ফেরত দেওয়ার জন্য কারখানা হিসাবে কোনও পরিষেবা লিখতে পারেন।

কেন বেশিরভাগ লোকেরা পরিষেবাগুলির মাধ্যমে কারখানাগুলি ব্যবহার করার পরামর্শ দেন? এটি আমি দেখেছি সেরা উত্তর যা পাওয়েল কোজলোস্কির বইটি থেকে এসেছে: অ্যাঙ্গুলারজেএস-এর সাথে মাস্টারিং ওয়েব অ্যাপ্লিকেশন ডেভলপমেন্ট।

কারখানার পদ্ধতিটি অ্যাংুলারজেএস নির্ভরতা ইনজেকশন সিস্টেমে জিনিসগুলি পাওয়ার সর্বাধিক সাধারণ উপায়। এটি অত্যন্ত নমনীয় এবং পরিশীলিত সৃষ্টি যুক্তি থাকতে পারে। কারখানাগুলি নিয়মিত কাজ করে, তাই আমরা "ব্যক্তিগত" ভেরিয়েবলগুলি অনুকরণ করার জন্য একটি নতুন লেজিকাল স্কোপের সুবিধাও নিতে পারি। এটি একটি কার্যকর পরিষেবার হিসাবে আমরা কোনও প্রদত্ত পরিষেবাদির বাস্তবায়ন বিবরণ গোপন করতে পারি "


1
  • সঙ্গে কারখানা আপনি আসলে একটি তৈরি বস্তুর ভেতরে কারখানা এবং এটি ফিরে।
  • সঙ্গে সেবা আপনি শুধুমাত্র একটি আছে মান ফাংশন ব্যবহার করে thisফাংশন নির্ধারণ করতে শব্দ।
  • সঙ্গে প্রদানকারী একটা ব্যাপার $getআপনি সংজ্ঞায়িত এবং এটি ব্যবহার করা যেতে পারে পেতে বস্তুর যে তথ্য প্রদান করে।

1

অ্যাঙ্গুলারজেএস-এ ব্যবসায়ের যুক্তি পরিচালনা করার তিনটি উপায় রয়েছে: ( ইয়াকভের কোর্সেরা অ্যাঙ্গুলারজেএস কোর্স দ্বারা অনুপ্রাণিত ) যা:

  1. সেবা
  2. কারখানা
  3. প্রদানকারী

এখানে আমরা কেবল পরিষেবা বনাম কারখানা সম্পর্কে কথা বলতে যাচ্ছি

পরিষেবা :

বাক্য গঠন:

app.js

 var app = angular.module('ServiceExample',[]);
 var serviceExampleController =
              app.controller('ServiceExampleController', ServiceExampleController);
 var serviceExample = app.service('NameOfTheService', NameOfTheService);

 ServiceExampleController.$inject = ['NameOfTheService'] //very important as this protects from minification of js files

function ServiceExampleController(NameOfTheService){
     serviceExampleController = this;
     serviceExampleController.data = NameOfTheService.getSomeData();
 }

function NameOfTheService(){
     nameOfTheService = this;
     nameOfTheService.data = "Some Data";
     nameOfTheService.getSomeData = function(){
           return nameOfTheService.data;
     }     
}

index.html

<div ng-controller = "ServiceExampleController as serviceExample">
   {{serviceExample.data}}
</div>

পরিষেবার মূল বৈশিষ্ট্যগুলি:

  1. অলসভাবে ইনস্ট্যান্টিয়েটেড : পরিষেবাটি যদি ইনজেকশন না করা হয় তবে এটি আর কখনও তাত্ক্ষণিকভাবে চলবে না। সুতরাং এটি ব্যবহার করতে আপনাকে এটি একটি মডিউলতে ইনজেক্ট করতে হবে।

  2. সিঙ্গেলটন : যদি এটি একাধিক মডিউলগুলিতে ইনজেকশন করা হয় তবে সকলের কেবল একটি নির্দিষ্ট উদাহরণে অ্যাক্সেস থাকবে। এ কারণেই, বিভিন্ন কন্ট্রোলারগুলিতে ডেটা ভাগ করা খুব সুবিধাজনক।

কারখানা

এখন AngularJS এর ​​কারখানার কথা বলি

প্রথমে সিনট্যাক্সটি একবার দেখে নেওয়া যাক :

app.js :

var app = angular.module('FactoryExample',[]);
var factoryController = app.controller('FactoryController', FactoryController);
var factoryExampleOne = app.factory('NameOfTheFactoryOne', NameOfTheFactoryOne);
var factoryExampleTwo = app.factory('NameOfTheFactoryTwo', NameOfTheFactoryTwo);

//first implementation where it returns a function
function NameOfTheFactoryOne(){
   var factory = function(){
      return new SomeService();
    }
   return factory;
}

//second implementation where an object literal would be returned
function NameOfTheFactoryTwo(){
   var factory = {
      getSomeService : function(){
          return new SomeService();
       }
    };
   return factory;
}

এখন নিয়ন্ত্রণকারী উপরোক্ত দুটি ব্যবহার:

 var factoryOne = NameOfTheFactoryOne() //since it returns a function
 factoryOne.someMethod();

 var factoryTwo = NameOfTheFactoryTwo.getSomeService(); //accessing the object
 factoryTwo.someMethod();

কারখানার বৈশিষ্ট্য:

  1. এই ধরণের পরিষেবাগুলি কারখানার নকশার ধরণটি অনুসরণ করে । কারখানাকে কেন্দ্রীয় জায়গা হিসাবে ভাবা যেতে পারে যা নতুন নতুন জিনিস বা পদ্ধতি তৈরি করে।

  2. এটি কেবল সিঙ্গলটনই নয়, কাস্টমাইজযোগ্য পরিষেবাও উত্পাদন করে।

  3. .service()পদ্ধতি হল কারখানা যে সবসময় সেবার একই ধরনের, যা একটি Singleton হয় উৎপন্ন হয়। এর আচরণটি কনফিগার করার কোনও সহজ উপায় নেই। এই .service()পদ্ধতিটি সাধারণত এমন কোনও কিছুর জন্য শর্টকাট হিসাবে ব্যবহৃত হয় যা কোনও কনফিগারেশনের প্রয়োজন হয় না।



0

আপনি এই সাদৃশ্যটির সাথে পার্থক্যটি বুঝতে পারবেন - একটি সাধারণ ফাংশনের মধ্যে পার্থক্যটি বিবেচনা করুন যা কিছু মূলক এবং নির্মাণকারীর ফাংশন ফেরত দেবে যা নতুন কীওয়ার্ড ব্যবহার করে তাত্ক্ষণিকভাবে আসে factory সুতরাং কারখানার তৈরি করা স্বাভাবিক ফাংশন তৈরির অনুরূপ যা কিছু মান ফিরে আসবে (আদিম বা একটি অবজেক্ট) যেখানে পরিষেবা তৈরি করা কনস্ট্রাক্টর ফাংশন (ওও ক্লাস) তৈরির মতো যা আমরা নতুন কীওয়ার্ড ব্যবহার করে উদাহরণ তৈরি করতে পারি। এখানে কেবল লক্ষ্য করার বিষয়টি হ'ল আমরা যখন পরিষেবাগুলি তৈরি করতে পরিষেবা পদ্ধতি ব্যবহার করি তখন এটি স্বয়ংক্রিয়ভাবে অ্যাংুলারজেএস দ্বারা সমর্থিত নির্ভরতা ইনজেকশন প্রক্রিয়া ব্যবহার করে এর উদাহরণ তৈরি করে will

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.