AngularJS: পরিষেবা বনাম সরবরাহকারী বনাম কারখানা


3319

একটি মধ্যে পার্থক্য কি কি Service, Providerএবং FactoryAngularJS মধ্যে?


244
আমি দেখতে পেলাম যে সমস্ত কৌণিক শর্তগুলি নতুনদের জন্য ভয়ঙ্কর ছিল। আমরা এই চিটশিটটি দিয়ে শুরু করেছি যা আমাদের প্রোগ্রামারদের পক্ষে কৌণিক demisx.github.io/angularjs/2014/09/14/… শিখার সময় বুঝতে সহজ ছিল । আশা করি এটি আপনার দলকেও সহায়তা করবে।
demisx

7
আমার মতে, পার্থক্যটি বোঝার সর্বোত্তম উপায় হ'ল অ্যাংুলারের নিজস্ব ডকুমেন্টেশন: ডকস.আঙ্গুলারজেএস.আর / গাইড / প্রোভাইডাররা এটি অত্যন্ত ভালভাবে ব্যাখ্যা করা হয়েছে এবং এটি বুঝতে আপনাকে সহায়তা করার জন্য একটি অদ্ভুত উদাহরণ ব্যবহার করে।
রাফায়েল মেরলিন

3
@ ব্লাইজ আপনাকে ধন্যবাদ! পোস্টে আমার মন্তব্য অনুসারে, আমি এটিকে ইচ্ছাকৃতভাবে ছেড়ে দিয়েছি, যেহেতু আমার অভিজ্ঞতা থেকে 99% ব্যবহারের ক্ষেত্রে সফলভাবে পরিচালনা করা যায় service.factory। এই বিষয়টিকে আরও জটিল করতে চাননি।
demisx

3
আমি এই আলোচনাটি খুব দরকারী স্ট্যাকওভারফ্লো.com
আনন্দ গুপ্ত

3
এখানে কিছু ভাল উত্তর কীভাবেservices,factoriesএবংprovidersকাজ করে।
মিস্টালিস

উত্তর:


2866

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

সেবা

সিনট্যাক্স: module.service( 'serviceName', function );
ফলাফল: যখন সার্ভিসনামকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে ফাংশনের একটি উদাহরণ সরবরাহ করা হবে। অন্য কথায় new FunctionYouPassedToService()

কারখানা

সিনট্যাক্স: module.factory( 'factoryName', function );
ফলাফল: ফ্যাক্টরিনামকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করার সময় আপনাকে মডিউল.ফ্যাক্টরিতে ফাংশন রেফারেন্সের সাহায্যে ফিরে আসা মানটি সরবরাহ করা হবে ।

প্রোভাইডার

সিনট্যাক্স: module.provider( 'providerName', function );
ফলাফল: সরবরাহকারীর নামকে ইনজেকশনযোগ্য যুক্তি হিসাবে ঘোষণা করার সময় আপনাকে সরবরাহ করা হবে (new ProviderFunction()).$get() । কনস্ট্রাক্টর ফাংশনটি $ get মেথড ProviderFunctionবলার আগে তড়িঘড়ি করা হয় - এটি ফাংশন রেফারেন্সটি মডিউল.প্রভাইডারে পাস করা হয়।

সরবরাহকারীদের সুবিধা রয়েছে যে তারা মডিউল কনফিগারেশন পর্যায়ে কনফিগার করা যায়।

প্রদত্ত কোডের জন্য এখানে দেখুন ।

মিসকো দ্বারা এখানে আরও দুর্দান্ত ব্যাখ্যা দেওয়া হয়েছে:

provide.value('a', 123);

function Controller(a) {
  expect(a).toEqual(123);
}

এক্ষেত্রে ইনজেক্টর কেবল সেই মানটি ফিরিয়ে দেয়। কিন্তু আপনি যদি মান গণনা করতে চান? তারপরে একটি কারখানা ব্যবহার করুন

provide.factory('b', function(a) {
  return a*2;
});

function Controller(b) {
  expect(b).toEqual(246);
}

সুতরাং factory একটি ফাংশন যা মান তৈরি করার জন্য দায়ী। লক্ষ্য করুন যে কারখানার কার্যকারিতা অন্যান্য নির্ভরতা জিজ্ঞাসা করতে পারে।

তবে আপনি যদি আরও ওও হতে চান এবং গ্রেটার নামে একটি ক্লাস চান তবে কী হবে?

function Greeter(a) {
  this.greet = function() {
    return 'Hello ' + a;
  }
}

তাহলে তাত্ক্ষণিকভাবে আপনাকে লিখতে হবে

provide.factory('greeter', function(a) {
  return new Greeter(a);
});

তারপরে আমরা এর মতো নিয়ামকটিতে 'গ্রিটার' চাইতে পারি

function Controller(greeter) {
  expect(greeter instanceof Greeter).toBe(true);
  expect(greeter.greet()).toEqual('Hello 123');
}

তবে এটি উপায় খুব শব্দযুক্ত। এটি লেখার একটি ছোট উপায় হবেprovider.service('greeter', Greeter);

কিন্তু যদি আমরা Greeterইঞ্জেকশনের আগে ক্লাসটি কনফিগার করতে চাইতাম ? তাহলে আমরা লিখতে পারতাম

provide.provider('greeter2', function() {
  var salutation = 'Hello';
  this.setSalutation = function(s) {
    salutation = s;
  }

  function Greeter(a) {
    this.greet = function() {
      return salutation + ' ' + a;
    }
  }

  this.$get = function(a) {
    return new Greeter(a);
  };
});

তারপরে আমরা এটি করতে পারি:

angular.module('abc', []).config(function(greeter2Provider) {
  greeter2Provider.setSalutation('Halo');
});

function Controller(greeter2) {
  expect(greeter2.greet()).toEqual('Halo 123');
}

একটি সাইড নোট হিসাবে, service, factory, এবং valueসব প্রদানকারীর থেকে উদ্ভূত হয়।

provider.service = function(name, Class) {
  provider.provide(name, function() {
    this.$get = function($injector) {
      return $injector.instantiate(Class);
    };
  });
}

provider.factory = function(name, factory) {
  provider.provide(name, function() {
    this.$get = function($injector) {
      return $injector.invoke(factory);
    };
  });
}

provider.value = function(name, value) {
  provider.factory(name, function() {
    return value;
  });
};

58
এছাড়াও স্ট্যাকওভারফ্লো.com/a/13763886/215945 দেখুন যা পরিষেবা এবং কারখানার মধ্যে পার্থক্য নিয়ে আলোচনা করে।
রাজকোক

3
611 সম্পাদনাতে আমি কৌণিক ধ্রুবক এবং মান ব্যবহার করেছিলাম। অপরের ইতিমধ্যে প্রদর্শিত পার্থক্যগুলি প্রদর্শন করতে। jsbin.com/ohamub/611/edit
নিক

17
যদিও একটি পরিষেবা ফাংশন একটি উদাহরণ তৈরি করে বলা হয়। এটি প্রকৃতপক্ষে কেবলমাত্র একবার ইনজেক্টর তৈরি করা হয়েছিল যা এটি সিঙ্গলটনের মতো করে। docs.angularjs.org/guide/dev_guide.services.creating_services
অ্যাঞ্জেলোখ

33
যদি এটি একটি সুস্পষ্ট ব্যবহারিক উদাহরণ ব্যবহার করে তবে এই উদাহরণটি অবিশ্বাস্য হতে পারে। আমি কি জিনিস বিন্দু চিন্তা করার চেষ্টা হারিয়ে toEqualএবং greeter.Greetহয়। সামান্য আরও বাস্তব এবং সম্পর্কিত সম্পর্কিত কিছু ব্যবহার করবেন না কেন?
কাইল পেনেল

5
প্রত্যাশা () ফাংশনটি ব্যবহার করা কোনও বিষয় ব্যাখ্যা করার জন্য একটি দুর্বল পছন্দ। পরের বার আসল ওয়ার্ল্ড কোড ব্যবহার করুন।
ক্রেগ

812

জেএস ফিডল ডেমো

" 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() {

    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 src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="MyCtrl">
    {{hellos}}
</div>
</body>


2
ফাংশনে thisপ্রসঙ্গে পরিবর্তন হয় না $get? - আপনি আর এই ফাংশনে ইনস্ট্যান্টেটেড সরবরাহকারীর কাছে আর উল্লেখ করেন না।
নাট-উইলকিনস

12
@ নাট: thisআসলে প্রসঙ্গটি বদলায় না, কারণ যা বলা হচ্ছে তা হ'ল new Provider()$ পান (), যেখানে Providerফাংশনটি পাস হচ্ছে app.provider। এর অর্থ এটি নির্মিত $get()হিসাবে একটি পদ্ধতি হিসাবে বলা হচ্ছে Provider, তাই উদাহরণ হিসাবে প্রস্তাব হিসাবে thisউল্লেখ করা হবে Provider
ব্র্যান্ডন

1
@ ব্র্যান্ডন ওহ ওকে ঠিক আছে ততক্ষণে পরিষ্কার। প্রথম নজরে বিভ্রান্ত - স্পষ্টির জন্য ধন্যবাদ!
নাট-উইলকিনস

3
Unknown provider: helloWorldProvider <- helloWorldস্থানীয়ভাবে এটি চালানোর সময় আমি কেন পাব ? এটি মন্তব্য করে, অন্যান্য 2 উদাহরণের জন্য একই ত্রুটি। কিছু গোপন সরবরাহকারী কনফিগারেশন আছে? (কৌণিক 1.0.8) - পাওয়া গেছে: স্ট্যাকওভারফ্লো.com
এন্টোইন

4
@ অ্যান্টাইন "অজানা সরবরাহ: হ্যালো ওয়ার্ল্ডপ্রাইডার" ত্রুটিটি পেয়ে যাওয়ার কারণ হ'ল কারণ আপনার .কনফিগ কোডটিতে আপনি 'হ্যালোওয়ার্ল্ডপ্রাইডার' ব্যবহার করেন, তবে আপনি যখন মাই অ্যাপ.প্রভাইডার ('হ্যালো ওয়ার্ল্ড', ফাংশন ()) সরবরাহকারীর সংজ্ঞা দেন তখন আপনি ব্যবহার করেন 'ওহে বিশ্ব'? অন্য কথায়, আপনার কনফিগার কোডে কৌণিক কীভাবে জানতে পারে যে আপনি হ্যালোওয়ার্ল্ড সরবরাহকারীর কথা উল্লেখ করছেন? ধন্যবাদ
jmtoung

645

টিএল; ডিআর

1) আপনি যখন কারখানাটি ব্যবহার করেন আপনি কোনও বস্তু তৈরি করেন, এতে বৈশিষ্ট্য যুক্ত করুন, তারপরে একই জিনিসটি ফিরিয়ে দিন। আপনি যখন এই ফ্যাক্টরিটিকে আপনার নিয়ামকের মধ্যে পাস করেন তখন অবজেক্টের সেই বৈশিষ্ট্যগুলি এখন আপনার কারখানার মাধ্যমে সেই নিয়ামকটিতে উপলব্ধ।

app.controller(‘myFactoryCtrl’, function($scope, myFactory){
  $scope.artist = myFactory.getArtist();
});

app.factory(‘myFactory’, function(){
  var _artist = Shakira’;
  var service = {};

  service.getArtist = function(){
    return _artist;
  }

  return service;
});


২) আপনি যখন পরিষেবাটি ব্যবহার করছেন , তখন কৌণিক জেএস 'নতুন' কীওয়ার্ড দিয়ে পর্দার আড়ালে তা ইনস্ট্যান্ট করে। তার কারণে, আপনি 'এটি'-তে বৈশিষ্ট্য যুক্ত করবেন এবং পরিষেবাটি' এটি 'ফেরত দেবে। আপনি যখন পরিষেবাটি আপনার নিয়ামকের মধ্যে পাস করেন, 'এই' এর এই বৈশিষ্ট্যগুলি এখন আপনার পরিষেবার মাধ্যমে সেই নিয়ামকটিতে উপলভ্য হবে।

app.controller(‘myServiceCtrl’, function($scope, myService){
  $scope.artist = myService.getArtist();
});

app.service(‘myService’, function(){
  var _artist = Nelly’;
  this.getArtist = function(){
    return _artist;
  }
});



3) সরবরাহকারীরা হ'ল একমাত্র পরিষেবা যা আপনি আপনার .config () ফাংশনে যেতে পারেন। আপনি যখন পরিষেবা পরিষেবা উপলব্ধ করার আগে মডিউল-ওয়াইড কনফিগারেশন সরবরাহ করতে চান তখন কোনও সরবরাহকারীর ব্যবহার করুন।

app.controller(‘myProvider’, function($scope, myProvider){
  $scope.artist = myProvider.getArtist();
  $scope.data.thingFromConfig = myProvider.thingOnConfig;
});

app.provider(‘myProvider’, function(){
 //Only the next two lines are available in the app.config()
 this._artist = ‘’;
 this.thingFromConfig = ‘’;
  this.$get = function(){
    var that = this;
    return {
      getArtist: function(){
        return that._artist;
      },
      thingOnConfig: that.thingFromConfig
    }
  }
});

app.config(function(myProviderProvider){
  myProviderProvider.thingFromConfig = This was set in config’;
});



নন টিএল; ডিআর

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

app.factory(‘myFactory’, function(){
  var service = {};
  return service;
});

এখন আমরা 'পরিষেবাদি'র সাথে সংযুক্ত থাকা যে কোনও বৈশিষ্ট্য আমাদের কন্ট্রোলারে' মাইফ্যাক্টরি 'পাস করার পরে আমাদের জন্য উপলব্ধ থাকবে।

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

app.factory(‘myFactory’, function($http, $q){
  var service = {};
  var baseUrl = https://itunes.apple.com/search?term=’;
  var _artist = ‘’;
  var _finalUrl = ‘’;

  var makeUrl = function(){
   _artist = _artist.split(‘ ‘).join(‘+’);
    _finalUrl = baseUrl + _artist + ‘&callback=JSON_CALLBACK’;
    return _finalUrl
  }

  return service;
});

এখানে আপনি লক্ষ্য করবেন যে আমরা সেই ভেরিয়েবলগুলি / ফাংশনটিকে 'পরিষেবার' সাথে সংযুক্ত করছি না। আমরা পরে এগুলি ব্যবহার বা সংশোধন করার জন্য কেবল এগুলি তৈরি করছি।

  • আইটিউনস এপিআই-র প্রয়োজনীয় বেস ইউআরএল API
  • _আর্টিস্ট হলেন সেই শিল্পী যা আমরা দেখতে চাই
  • _ফাইনাল ইউআরএল চূড়ান্ত এবং সম্পূর্ণরূপে নির্মিত URL যা আমরা আইটিউনসে কল করব
  • মেকআরএল এমন একটি ফাংশন যা আমাদের আইটিউনস বন্ধুত্বপূর্ণ ইউআরএল তৈরি এবং ফিরিয়ে আনবে।

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

আমরা সেটআরটিস্ট এবং getArtist পদ্ধতি তৈরি করতে যা যা কেবল শিল্পীকে ফিরে আসে বা সেট করে। আমরা এমন একটি পদ্ধতি তৈরি করতে যাচ্ছি যা আমাদের তৈরি ইউআরএল দিয়ে আইটিউনস এপিআই কল করবে। এই পদ্ধতিটি এমন প্রতিশ্রুতি ফেরত যাচ্ছে যা আইটিউনস এপিআই থেকে ডেটা ফিরে আসার পরে পূরণ করবে fulfill অ্যাঙ্গুলারজেএস-এ প্রতিশ্রুতি ব্যবহার করার মতো অভিজ্ঞতা যদি আপনার না হয় তবে আমি তাদের প্রতি গভীর ডুব দেওয়ার পরামর্শ দিচ্ছি।

নীচে সেটআর্টিস্ট একজন শিল্পীকে গ্রহণ করে এবং আপনাকে শিল্পী সেট করার অনুমতি দেয়। getArtist শিল্পীকে ফিরিয়ে দেয়। callItunes প্রথম আদেশ URL টি আমরা আমাদের $ HTTP অনুরোধের সাথে ব্যবহার করব নির্মাণ করার জন্য makeUrl () কল। তারপরে এটি একটি প্রতিশ্রুতি অবজেক্ট সেট আপ করে, আমাদের চূড়ান্ত ইউআরএল দিয়ে একটি request HTTP অনুরোধ করে, তারপরে যেহেতু $ http কোনও প্রতিশ্রুতি ফিরিয়ে দেয়, আমরা আমাদের অনুরোধের পরে .success বা .error কল করতে সক্ষম হয়েছি। তারপরে আমরা আইটিউনস ডেটা দিয়ে আমাদের প্রতিশ্রুতিটি সমাধান করি, বা আমরা 'একটি ত্রুটি হয়েছিল' এমন বার্তা দিয়ে তা প্রত্যাখ্যান করি।

app.factory('myFactory', function($http, $q){
  var service = {};
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  service.setArtist = function(artist){
    _artist = artist;
  }

  service.getArtist = function(){
    return _artist;
  }

  service.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

  return service;
});

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

app.controller('myFactoryCtrl', function($scope, myFactory){
  $scope.data = {};
  $scope.updateArtist = function(){
    myFactory.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myFactory.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

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

2) পরিষেবা
কোনও পরিষেবা তৈরি করার সময় সবচেয়ে বড় জিনিসটি হ'ল এটি 'নতুন' কীওয়ার্ড দিয়ে ইনস্ট্যান্ট করা। আপনার জাভাস্ক্রিপ্ট গুরুগুলির জন্য এটি আপনাকে কোডের প্রকৃতির একটি বড় ইঙ্গিত দেবে। আপনারা জাভাস্ক্রিপ্টের সীমিত পটভূমিতে বা যারা 'নতুন' কীওয়ার্ডটি আসলে কী করেন তার সাথে খুব বেশি পরিচিত নন, তাদের জন্য কিছু জাভাস্ক্রিপ্ট মূলসূত্রগুলি পর্যালোচনা করুন যা পরিশেষে কোনও পরিষেবার প্রকৃতি বুঝতে আমাদের সহায়তা করবে।

আপনি যখন 'নতুন' কীওয়ার্ডের সাহায্যে কোনও ফাংশনটি আহ্বান করবেন তখন সত্যিই ঘটে যাওয়া পরিবর্তনগুলি দেখতে, আসুন একটি ফাংশন তৈরি করি এবং এটি 'নতুন' কীওয়ার্ডের সাহায্যে প্রার্থনা করি, তারপরে দোভাষী কীভাবে এটি 'নতুন' কীওয়ার্ডটি দেখেন তা দেখান। শেষ ফলাফল উভয়ই এক হবে।

প্রথমে আমাদের কনস্ট্রাক্টর তৈরি করা যাক।

var Person = function(name, age){
  this.name = name;
  this.age = age;
}

এটি একটি সাধারণ জাভাস্ক্রিপ্ট কনস্ট্রাক্টর ফাংশন। এখন যখনই আমরা 'নতুন' কীওয়ার্ড ব্যবহার করে ব্যক্তি ফাংশনটি শুরু করব তখনই 'এটি' সদ্য নির্মিত বস্তুর সাথে আবদ্ধ থাকবে।

এখন আসুন আমরা আমাদের ব্যক্তির প্রোটোটাইপটিতে একটি পদ্ধতি যুক্ত করি যাতে এটি আমাদের ব্যক্তি 'শ্রেণি'র প্রতিটি উদাহরণে উপলব্ধ।

Person.prototype.sayName = function(){
  alert(‘My name is  + this.name);
}

এখন, যেহেতু আমরা প্রোটোটাইপের উপর sayName ফাংশনটি রেখেছি, ততক্ষণ প্রতিটি ব্যক্তির সেই উদাহরণটির নাম সতর্কতার জন্য sayName ফাংশনটি কল করতে সক্ষম হবে।

এখন যেহেতু আমাদের পার্সোন কনস্ট্রাক্টর ফাংশন এবং এর প্রোটোটাইপে আমাদের sayName ফাংশন রয়েছে, আসুন প্রকৃতপক্ষে ব্যক্তির একটি উদাহরণ তৈরি করি তারপরে sayName ফাংশনটি কল করি।

var tyler = new Person(‘Tyler’, 23);
tyler.sayName(); //alerts ‘My name is Tyler’

সুতরাং সমস্ত একসাথে একজন ব্যক্তির কনস্ট্রাক্টর তৈরির জন্য কোড, এর প্রোটোটাইপটিতে একটি ফাংশন যুক্ত করে, একজন ব্যক্তি উদাহরণ তৈরি করে এবং তার প্রোটোটাইপে ফাংশনটি কল করার পরে এটি দেখতে এরকম দেখাচ্ছে।

var Person = function(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function(){
  alert(‘My name is  + this.name);
}
var tyler = new Person(‘Tyler’, 23);
tyler.sayName(); //alerts ‘My name is Tyler’

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

'নতুন' কীওয়ার্ডটি আসলে জাভাস্ক্রিপ্টে কী করছে সে সম্পর্কে আপনি কীভাবে ভাবতে পারেন তার নীচে কোডটি রয়েছে। এটি মূলত উপরের অনুচ্ছেদের একটি কোড উদাহরণ। আমি 'ইন্টারপ্রিটার ভিউ' বা নোটের ভিতরে দোভাষী যেভাবে কোডটি দেখি সেভাবে রেখেছি।

var Person = function(name, age){
  //The below line creates an object(obj) that will delegate to the person’s prototype on failed lookups.
  //var obj = Object.create(Person.prototype);

  //The line directly below this sets ‘this’ to the newly created object
  //this = obj;

  this.name = name;
  this.age = age;

  //return this;
}

জাভাস্ক্রিপ্টে 'নতুন' কীওয়ার্ডটি আসলে কী করে সে সম্পর্কে এই জ্ঞান থাকা, AngularJS- এ একটি পরিষেবা তৈরি করা বোঝা সহজ হওয়া উচিত।

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

আমরা কারখানার উদাহরণ দিয়ে মূলত যা করেছি তার বিপরীতে, আমাদের কোনও বস্তু তৈরি করার দরকার নেই তারপরে সেই বস্তুটি ফিরিয়ে আনতে হবে কারণ যেমনটি এর আগেও বহুবার উল্লিখিত হয়েছিল, আমরা 'নতুন' কীওয়ার্ডটি ব্যবহার করেছি যাতে দোভাষী সেই অবজেক্টটি তৈরি করে, তার কাছে এটি অর্পণ করা হয় এটি প্রোটোটাইপ, তারপরে আমাদের কাজটি না করে আমাদের জন্য এটি ফিরিয়ে দিন।

প্রথম জিনিসগুলি প্রথমে আমাদের 'ব্যক্তিগত' এবং সহায়ক ফাংশন তৈরি করা যাক। এটি আমাদের পরিচিত কারখানার সাথে ঠিক একই জিনিসটি করার কারণে এটি খুব পরিচিত হওয়া উচিত। আমি এখানে প্রতিটি লাইন কী করে তা ব্যাখ্যা করব না কারণ আমি কারখানার উদাহরণে এটি করেছি, আপনি যদি বিভ্রান্ত হন তবে কারখানার উদাহরণটি পুনরায় পড়ুন।

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }
});

এখন, আমরা আমাদের সমস্ত পদ্ধতি যুক্ত করব যা আমাদের নিয়ামকটিতে 'এটি'র জন্য উপলব্ধ available

app.service('myService', function($http, $q){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  this.setArtist = function(artist){
    _artist = artist;
  }

  this.getArtist = function(){
    return _artist;
  }

  this.callItunes = function(){
    makeUrl();
    var deferred = $q.defer();
    $http({
      method: 'JSONP',
      url: _finalUrl
    }).success(function(data){
      deferred.resolve(data);
    }).error(function(){
      deferred.reject('There was an error')
    })
    return deferred.promise;
  }

});

এখন ঠিক আমাদের কারখানার মতোই, সেটআর্টলিস্ট, গেটআরটিস্ট, এবং কলআইটিউনস যে কোনও কন্ট্রোলারে আমরা মাই সার্ভিসটিতে যাব তা উপলব্ধ থাকবে। এখানে মাই সার্ভিস নিয়ন্ত্রক (যা আমাদের ফ্যাক্টরি নিয়ামকের মতো প্রায় একই)

app.controller('myServiceCtrl', function($scope, myService){
  $scope.data = {};
  $scope.updateArtist = function(){
    myService.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myService.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }
});

আমি আগে যেমন উল্লেখ করেছি, একবার আপনি সত্যিই 'নতুন' কী করে তা বুঝতে পারার পরে, পরিষেবাগুলি অ্যাঙ্গুলারজেএস-এর কারখানার প্রায় একইরকম।

3) সরবরাহকারী

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

প্রথমে আমরা আমাদের সরবরাহকারীটিকে আমাদের পরিষেবা এবং কারখানার সাথে একইভাবে সেট আপ করেছি। নীচে ভেরিয়েবলগুলি আমাদের 'ব্যক্তিগত' এবং সহায়তা ফাংশন।

app.provider('myProvider', function(){
   var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  //Going to set this property on the config function below.
  this.thingFromConfig = ‘’;

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }
}

* আবার যদি উপরের কোডের কোনও অংশ বিভ্রান্তিকর হয় তবে ফ্যাক্টরি বিভাগটি পরীক্ষা করে দেখুন যেখানে আমি ব্যাখ্যা করি যে এটি সমস্ত কি এটি আরও বেশি বিশদ করে।

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

সরবরাহকারীর সাথে পরিষেবা তৈরি করার সময়, আপনার নিয়ামকটিতে কেবলমাত্র বৈশিষ্ট্য / পদ্ধতিগুলি পাওয়া যাবে সেগুলি হ'ল properties get () ফাংশন থেকে ফিরে আসা বৈশিষ্ট্য / পদ্ধতিগুলি। নীচের কোডগুলি "এই" পেতে (যা আমরা জানি যে শেষ পর্যন্ত সেই ফাংশন থেকে ফিরে আসবে) রাখে। এখন, function ফাংশনটি আমাদের নিয়ামকটিতে যে সমস্ত পদ্ধতি / বৈশিষ্ট্যগুলি উপলভ্য হতে চায় তা প্রদান করে। এখানে একটি কোড উদাহরণ।

this.$get = function($http, $q){
    return {
      callItunes: function(){
        makeUrl();
        var deferred = $q.defer();
        $http({
          method: 'JSONP',
          url: _finalUrl
        }).success(function(data){
          deferred.resolve(data);
        }).error(function(){
          deferred.reject('There was an error')
        })
        return deferred.promise;
      },
      setArtist: function(artist){
        _artist = artist;
      },
      getArtist: function(){
        return _artist;
      },
      thingOnConfig: this.thingFromConfig
    }
  }

এখন পুরো সরবরাহকারীর কোডটি এর মতো দেখাচ্ছে

app.provider('myProvider', function(){
  var baseUrl = 'https://itunes.apple.com/search?term=';
  var _artist = '';
  var _finalUrl = '';

  //Going to set this property on the config function below
  this.thingFromConfig = '';

  var makeUrl = function(){
    _artist = _artist.split(' ').join('+');
    _finalUrl = baseUrl + _artist + '&callback=JSON_CALLBACK'
    return _finalUrl;
  }

  this.$get = function($http, $q){
    return {
      callItunes: function(){
        makeUrl();
        var deferred = $q.defer();
        $http({
          method: 'JSONP',
          url: _finalUrl
        }).success(function(data){
          deferred.resolve(data);
        }).error(function(){
          deferred.reject('There was an error')
        })
        return deferred.promise;
      },
      setArtist: function(artist){
        _artist = artist;
      },
      getArtist: function(){
        return _artist;
      },
      thingOnConfig: this.thingFromConfig
    }
  }
});

এখন ঠিক যেমন আমাদের কারখানা ও পরিষেবাতে সেটআর্টিস্ট, গেটআরটিস্ট, এবং কলআইটিউনস আমরা মাইপ্রোভাইডারকে যে কোনও কন্ট্রোলারে যাব তা উপলব্ধ থাকবে। এখানে মাইপ্রোভাইডার নিয়ামক (যা আমাদের ফ্যাক্টরি / পরিষেবা নিয়ামকের মতো প্রায় একই)

app.controller('myProviderCtrl', function($scope, myProvider){
  $scope.data = {};
  $scope.updateArtist = function(){
    myProvider.setArtist($scope.data.artist);
  };

  $scope.submitArtist = function(){
    myProvider.callItunes()
      .then(function(data){
        $scope.data.artistData = data;
      }, function(data){
        alert(data);
      })
  }

  $scope.data.thingFromConfig = myProvider.thingOnConfig;
});

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

app.config(function(myProviderProvider){
  //Providers are the only service you can pass into app.config
  myProviderProvider.thingFromConfig = 'This sentence was set in app.config. Providers are the only service that can be passed into config. Check out the code to see how it works';
});

এখন আপনি দেখতে পাবেন যে কীভাবে 'প্রযোজ্য ফর্মকনফিগ' আমাদের সরবরাহকারীর মতো খালি স্ট্রিং, কিন্তু যখন এটি ডম-এ প্রদর্শিত হবে, তখন এটি হবে 'এই বাক্যটি সেট করা হয়েছিল ...'।


11
এই চমত্কার লেখার মধ্যে যে অংশটি অনুপস্থিত তা হ'ল কোনও কারখানায় পরিষেবাটি ব্যবহারের অপেক্ষাকৃত সুবিধা; যা স্পষ্টভাবে লিওর দ্বারা গৃহীত উত্তরে ব্যাখ্যা করা হয়েছে
অনন্ত

2
এফডব্লিউআইডাব্লু (সম্ভবত খুব বেশি নয়), এখানে এমন একটি ব্লগার যা অ্যাঙ্গুলার
entries

3
'জাভাস্ক্রিপ্ট গুরু' মুষ্ট্যাঘাত ছিল। : ডিআই মনে করেন এই উত্তরটি জিনিসগুলি খুব বেশি পরিষ্কার করে দেয়। দুর্দান্ত লেখা।
আম্মশ্রীরা

4
আপনার টিএলডিআর টিএলডিআর দরকার।
জেনসবি

3
@ জেনসবি টিএল; ডাঃ - প্রতিক্রিয়া জানুন।
টাইলার ম্যাকগিনিস

512

সমস্ত পরিষেবাদি সিঙ্গেলন ; তারা প্রতি অ্যাপ্লিকেশন একবার তাত্ক্ষণিকভাবে পেতে। এগুলি যে কোনও প্রকারের হতে পারে , তা সে আদিম, বস্তুর আক্ষরিক, ফাংশন, এমনকি কাস্টম ধরণের উদাহরণ হতে পারে।

value, factory, service, constant, এবং providerপদ্ধতি সব প্রদানকারীর হয়। কীভাবে পরিষেবাগুলি তাত্পর্যপূর্ণ করা যায় সেগুলি তারা ইনজেক্টরকে শিখায়।

সর্বাধিক ভার্বোজ, তবে সবচেয়ে বিস্তৃত একটি হ'ল একটি সরবরাহকারী রেসিপি recipe অবশিষ্ট চারটি রেসিপি ধরনের - মূল্য, কারখানার, পরিষেবা এবং ধ্রুব - একটি প্রদানকারী রেসিপি উপরে মাত্র অন্বিত চিনি আছে

  • মূল্য ম্যারাডোনা সহজ মামলা, যেখানে আপনি পরিষেবার নিজেকে instantiate এবং প্রদান করা হয় উপস্থাপনার ক্ষেত্রে মান প্রবেশক করতে।
  • কারখানার রেসিপি Injector একটি কারখানা ফাংশন এটি কল যখন এটি সেবা instantiate প্রয়োজন দেয়। যখন ডাকা হয়, ফ্যাক্টরি ফাংশন পরিষেবা দৃষ্টান্ত তৈরি করে এবং প্রদান করে। পরিষেবার নির্ভরতাগুলি ফাংশনগুলির আর্গুমেন্ট হিসাবে ইনজেক্ট করা হয়। সুতরাং এই রেসিপিটি ব্যবহার করে নিম্নলিখিত ক্ষমতা যুক্ত করা হয়:
    • অন্যান্য পরিষেবাগুলি ব্যবহারের ক্ষমতা (নির্ভরতা রয়েছে)
    • পরিষেবা সূচনা
    • বিলম্বিত / অলস সূচনা
  • পরিষেবা রেসিপি প্রায় কারখানার রেসিপি হিসাবে একই, কিন্তু এখানে Injector একটি বস্তুর পূজা কন্সট্রাকটর পরিবর্তে নতুন অপারেটর একটি কারখানা ফাংশন।
  • প্রোভাইডার রেসিপি সাধারণত Overkill । এটি আপনাকে কারখানার সৃষ্টি কনফিগার করার অনুমতি দিয়ে ইন্ডিয়ারেশনের আরও একটি স্তর যুক্ত করে।

    আপনার যখন সরবরাহকারী রেসিপিটি তখনই ব্যবহার করা উচিত যখন আপনি অ্যাপ্লিকেশন-বিস্তৃত কনফিগারেশনের জন্য একটি API প্রকাশ করতে চান যা অ্যাপ্লিকেশন শুরুর আগে তৈরি করতে হবে। এটি কেবলমাত্র পুনরায় ব্যবহারযোগ্য পরিষেবাগুলির জন্য আকর্ষণীয় যাঁর আচরণের মধ্যে অ্যাপ্লিকেশনগুলির মধ্যে কিছুটা ভিন্ন হতে পারে।

  • স্থায়ী রেসিপি শুধু মূল্য রেসিপি ছাড়া আপনার যে পরিষেবাগুলি পাওয়া যায় সংজ্ঞায়িত করতে পারবেন মত হল কনফিগ ফেজ। মান রেসিপি ব্যবহার করে তৈরি পরিষেবাগুলির চেয়ে শীঘ্রই। মানগুলির বিপরীতে, এগুলি ব্যবহার করে সজ্জিত করা যায় না decorator
দেখুন প্রদানকারী ডকুমেন্টেশন


2
সুতরাং পরিষেবা এবং কারখানা মূলত একই? অন্য একটির ব্যবহার বিকল্প বিকল্প বাক্য গঠন ছাড়া আর কিছুই সরবরাহ করে না?
ম্যাট

2
@ ম্যাট, হ্যাঁ, পরিষেবা ইতিমধ্যে একটি সংক্ষিপ্ত উপায় যখন আপনি ইতিমধ্যে আপনার নিজস্ব ফাংশন রেখেছেন যা আপনি পরিষেবা হিসাবে প্রকাশ করতে চান। ডক্স থেকে: মাইএপ.ফ্যাক্টরি ('ইউনিকর্নল্যাঞ্চার', ["অ্যাপিটোকেন", ফাংশন (এপিটোকেন) new নতুন ইউনিকর্নলৌনচার (এপিটোকেন) ফেরান;}]); বনাম: myApp.service ('ইউনিকর্নল্যাঞ্চার', ["এপিটোকেন", ইউনিকর্ন লঞ্চার]);
জানেক

5
@ জোশ্পেরি নবাগত হিসাবে আমি কিছুক্ষণের জন্য পরিষেবা এবং কারখানার মধ্যে পার্থক্যটি আবিষ্কার করেছি। আমি রাজি না যে এটি এখন পর্যন্ত সেরা উত্তর! আমি পরিষেবাটি কোনও পরিষেবা শ্রেণীর (যেমন এনকোডার / ডিকোডার শ্রেণি) হিসাবে বুঝতে পারি, যার কিছু ব্যক্তিগত সম্পত্তি থাকতে পারে। এবং কারখানা রাষ্ট্রহীন সহায়ক পদ্ধতির একটি সেট সরবরাহ করে।
stanleyxu2005

3
উপরের অন্যান্য উত্তরের ইয়া উদাহরণগুলি খুব পরিষ্কারভাবে মূল পার্থক্য বি / ডাব্লু পরিষেবা এবং সরবরাহকারীগুলিকে ব্যাখ্যা করতে ব্যর্থ হয় যা এই রেসিপিগুলি তাত্ক্ষণিক সময়ে ইনস্ট্যান্ট করা হয়।
আশীষ সিং

223

অ্যাঙ্গুলারজেএস কারখানা, পরিষেবা এবং সরবরাহকারী বোঝা

এগুলি সবই পুনরায় ব্যবহারযোগ্য সিঙ্গলটন অবজেক্টগুলি ভাগ করতে ব্যবহৃত হয়। এটি আপনার অ্যাপ্লিকেশন / বিভিন্ন উপাদান / মডিউল জুড়ে পুনরায় ব্যবহারযোগ্য কোড ভাগ করতে সহায়তা করে।

দস্তাবেজ পরিষেবা / কারখানা থেকে :

  • অলসভাবে তাত্ক্ষণিকভাবে - কোনও অ্যাপ্লিকেশন উপাদান এটির উপর নির্ভর করে যখন কৌনিকটি কেবল কোনও পরিষেবা / কারখানা ইনস্ট্যান্ট করে।
  • সিলেটলেটস - একটি পরিষেবার উপর নির্ভরশীল প্রতিটি উপাদান পরিষেবা কারখানার দ্বারা উত্পন্ন একক উদাহরণের জন্য একটি রেফারেন্স পায়।

কারখানা

একটি ফ্যাক্টরি এমন ফাংশন যেখানে আপনি কোনও বস্তু তৈরির আগে যুক্তিগুলি পরিচালনা / যুক্ত করতে পারবেন, তারপরে সদ্য নির্মিত বস্তুটি ফিরে আসবে।

app.factory('MyFactory', function() {
    var serviceObj = {};
    //creating an object with methods/functions or variables
    serviceObj.myFunction = function() {
        //TO DO:
    };
    //return that object
    return serviceObj;
});

ব্যবহার

এটি ক্লাসের মতো কেবল ফাংশনগুলির সংগ্রহ হতে পারে। অতএব, আপনি যখন এটি আপনার নিয়ামক / কারখানা / নির্দেশক ক্রিয়াকলাপগুলিতে ইনজেকশন দিচ্ছেন তখন এটি বিভিন্ন নিয়ামকগুলিতে ইনস্ট্যান্ট করা যেতে পারে। এটি প্রতি অ্যাপ্লিকেশনটিতে একবার একবার ইনস্ট্যান্ট হয়।

সেবা

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

app.service('MyService', function() {
    //directly binding events to this context
    this.myServiceFunction = function() {
        //TO DO:
    };
});

ব্যবহার

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

প্রদানকারী

একটি সরবরাহকারী একটি কনফিগারযোগ্য পরিষেবা অবজেক্ট তৈরি করতে ব্যবহৃত হয়। আপনি কনফিগার ফাংশন থেকে পরিষেবা সেটিংস কনফিগার করতে পারেন। এটি ফাংশনটি ব্যবহার করে একটি মান ফেরত $get()দেয়। $getফাংশন কৌণিক চালান ফেজ উপর মৃত্যুদন্ড কার্যকর হয়।

app.provider('configurableService', function() {
    var name = '';
    //this method can be be available at configuration time inside app.config.
    this.setName = function(newName) {
        name = newName;
    };
    this.$get = function() {
        var getName = function() {
             return name;
        };
        return {
            getName: getName //exposed object to where it gets injected.
        };
    };
});

ব্যবহার

যখন আপনার পরিষেবা অবজেক্টটি উপলব্ধ করার আগে মডিউল-ভিত্তিক কনফিগারেশন সরবরাহ করতে হবে, যেমন। তোমার মত আপনার পরিবেশ ভিত্তিতে আপনার এপিআই URL টি সেট করতে চান অনুমান dev, stageবাprod

বিঃদ্রঃ

কেবল সরবরাহকারীর কৌনিক কনফিগার পর্যায়ে উপলব্ধ থাকবে, যখন পরিষেবা এবং কারখানাটি নেই।

আশা করি এটি কারখানা, পরিষেবা এবং সরবরাহকারী সম্পর্কে আপনার বোঝাপড়া পরিষ্কার করেছে ।


1
আমি যদি একটি নির্দিষ্ট ইন্টারফেসের সাথে একটি পরিষেবা পেতে চাই, তবে দুটি পৃথক বাস্তবায়ন করতে চাই এবং প্রতিটিটিকে একটি নিয়ামকতে ইনজেকশনের সাথে ইউআই-রাউটার ব্যবহার করে বিভিন্ন রাজ্যে সংযুক্ত করে তবে আমি কী করব? উদাহরণস্বরূপ, এক রাজ্যে দূরবর্তী কল করুন তবে স্থানীয় স্টোরেজে অন্য জায়গায় লিখুন। সরবরাহকারী দস্তাবেজগুলি ব্যবহার করতে বলে only when you want to expose an API for application-wide configuration that must be made before the application starts. This is usually interesting only for reusable services whose behavior might need to vary slightly between applications, তাই সম্ভব হচ্ছে না, তাই না?
কিউস

191

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

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

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

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

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

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

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

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


2
আমি এই উত্তরটিও সবচেয়ে পছন্দ করি। তাদের সকলের মুল বক্তব্য হ'ল ডিআইয়ের মাধ্যমে যখনই প্রয়োজন হয় কোনও বস্তুর অ্যাক্সেস সরবরাহ করা। সাধারণত আপনি factoryএস দিয়ে ভাল করছেন । serviceকফির স্ক্রিপ্ট, টাইপসক্রিপ্ট, ইএস like ইত্যাদি ইত্যাদির একমাত্র কারণগুলির কারণগুলি আপনি তাদের শ্রেণি বাক্য গঠন ব্যবহার করতে পারেন। providerআপনার মডিউলটি যদি বিভিন্ন অ্যাপ্লিকেশনে বিভিন্ন সেটিংস সহ বিভিন্ন অ্যাপ্লিকেশন ব্যবহার করে ব্যবহৃত হয় তবেই আপনার প্রয়োজন app.config()। যদি আপনার পরিষেবাটি খাঁটি সিঙ্গলটন হয় বা কোনও কিছুর উদাহরণ তৈরি করতে সক্ষম হয় তবে এটি কেবল আপনার প্রয়োগের উপর নির্ভর করে।
আন্দ্রে লিনার্ট

137

পরিষেবা বনাম সরবরাহকারী বনাম কারখানা:

আমি এটি সহজ রাখার চেষ্টা করছি। এটি সমস্ত বেসিক জাভাস্ক্রিপ্ট ধারণা সম্পর্কে।

প্রথমত, আসুন AngularJS- এ পরিষেবাগুলি সম্পর্কে কথা বলি !

পরিষেবাটি কী: কৌনিক জেএসে, পরিষেবাতেসিঙ্গলটন জাভাস্ক্রিপ্ট অবজেক্ট ছাড়া কিছু নয় যা কিছু দরকারী পদ্ধতি বা বৈশিষ্ট্য সংরক্ষণ করতে পারে। এই সিঙ্গলটন অবজেক্টটি এনজিএপি (অ্যাঙ্গুলার অ্যাপ) ভিত্তিতে তৈরি করা হয়েছে এবং এটি বর্তমান অ্যাপের মধ্যে থাকা সমস্ত কন্ট্রোলারের মধ্যে ভাগ করা আছে। যখন Angularjs কোনও পরিষেবা অবজেক্ট ইনস্ট্যান্ট করে, এটি একটি অনন্য পরিষেবা নামের সাথে এই পরিষেবা অবজেক্টটিকে নিবন্ধভুক্ত করে। সুতরাং প্রতিবার যখন আমাদের পরিষেবা উদাহরণের প্রয়োজন হয় তখন কৌনিক এই পরিষেবা নামের জন্য রেজিস্ট্রি সন্ধান করে এবং এটি পরিষেবা অবজেক্টের রেফারেন্স দেয়। এমন যে আমরা পরিষেবা অবজেক্টে পদ্ধতি, অ্যাক্সেসের বৈশিষ্ট্য ইত্যাদি শুরু করতে পারি। আপনার প্রশ্ন থাকতে পারে আপনি নিয়ন্ত্রণকারীদের স্কোপ অবজেক্টে সম্পত্তি, পদ্ধতিও রাখতে পারেন কিনা! তাহলে আপনার কেন পরিষেবা অবজেক্টের দরকার? উত্তরগুলি হল: একাধিক নিয়ামক সুযোগের মধ্যে পরিষেবাগুলি ভাগ করা হয়। আপনি যদি কোনও নিয়ন্ত্রণকারীর স্কোপ অবজেক্টে কিছু বৈশিষ্ট্য / পদ্ধতি রাখেন তবে তা কেবল বর্তমান স্কোপে উপলব্ধ।

সুতরাং যদি তিনটি কন্ট্রোলার সুযোগ থাকে তবে এটি নিয়ামকএ, কন্ট্রোলারবি এবং কন্ট্রোলারসি হতে দিন, সকলেই একই পরিষেবা উদাহরণ ভাগ করে নেবে।

<div ng-controller='controllerA'>
    <!-- controllerA scope -->
</div>
<div ng-controller='controllerB'>
    <!-- controllerB scope -->
</div>
<div ng-controller='controllerC'>
    <!-- controllerC scope -->
</div>

কীভাবে একটি পরিষেবা তৈরি করবেন?

AngularJS একটি পরিষেবা নিবন্ধনের জন্য বিভিন্ন পদ্ধতি সরবরাহ করে। এখানে আমরা তিনটি পদ্ধতির কারখানায় মনোনিবেশ করব (..), পরিষেবা (..), সরবরাহকারী (..);

কোড রেফারেন্সের জন্য এই লিঙ্কটি ব্যবহার করুন

কারখানার কাজ:

আমরা নীচে হিসাবে একটি কারখানা ফাংশন সংজ্ঞায়িত করতে পারেন।

factory('serviceName',function fnFactory(){ return serviceInstance;})

AngularJS প্রদান করে 'কারখানা (' SERVICENAME ', fnFactory)' পদ্ধতি যা দুই প্যারামিটার হয়, SERVICENAME এবং জাভাস্ক্রিপ্ট ফাংশন লাগে। কৌনিকটি নীচের মতো ফাংশন ফিনফ্যাক্ট্রি () ব্যবহার করে পরিষেবা উদাহরণ তৈরি করে।

var serviceInstace = fnFactory();

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

উদাহরণ:

var app= angular.module('myApp', []);
//creating service using factory method
app.factory('factoryPattern',function(){
  var data={
    'firstName':'Tom',
    'lastName':' Cruise',
    greet: function(){
      console.log('hello!' + this.firstName + this.lastName);
    }
  };

  //Now all the properties and methods of data object will be available in our service object
  return data;
});

পরিষেবা ফাংশন:

service('serviceName',function fnServiceConstructor(){})

এটি অন্য উপায়, আমরা একটি পরিষেবা নিবন্ধন করতে পারি। একমাত্র পার্থক্যটি হল AngularJS যেভাবে পরিষেবা অবজেক্টটি ইনস্ট্যান্ট করার চেষ্টা করে। এবার কৌণিক 'নতুন' কীওয়ার্ড ব্যবহার করে এবং কনস্ট্রাক্টর ফাংশনটিকে নীচের মতো কিছু বলে।

var serviceInstance = new fnServiceConstructor();

কনস্ট্রাক্টর ফাংশনে আমরা পরিষেবা বস্তুতে বৈশিষ্ট্য / পদ্ধতি যুক্ত করার জন্য 'এই' কীওয়ার্ডটি ব্যবহার করতে পারি। উদাহরণ:

//Creating a service using the service method
var app= angular.module('myApp', []);
app.service('servicePattern',function(){
  this.firstName ='James';
  this.lastName =' Bond';
  this.greet = function(){
    console.log('My Name is '+ this.firstName + this.lastName);
  };
});

সরবরাহকারী ফাংশন:

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

নীচের মত আমরা সরবরাহকারী বাক্য গঠন ব্যবহার করে কনফিগারযোগ্য পরিষেবা তৈরি করতে পারি।

/*step1:define a service */
app.provider('service',function serviceProviderConstructor(){});

/*step2:configure the service */
app.config(function configureService(serviceProvider){});

অভ্যন্তরীণভাবে সরবরাহকারীর সিনট্যাক্স কীভাবে কাজ করে?

1. সরবরাহকারী অবজেক্টটি আমরা আমাদের সরবরাহকারীর ফাংশনে সংজ্ঞায়িত কনস্ট্রাক্টর ফাংশন ব্যবহার করে তৈরি করি।

var serviceProvider = new serviceProviderConstructor();

২. আমরা যে ফাংশনটি app.config () এ পাস করেছি, তা কার্যকর করা হবে। এটিকে কনফিগার ফেজ বলা হয় এবং এখানে আমাদের পরিষেবাটি কাস্টমাইজ করার সুযোগ রয়েছে।

configureService(serviceProvider);

৩. সর্বশেষে সার্ভিস উদাহরণটি সার্ভিসপ্রোডাইভারের পদ্ধতিটি পান কল করে তৈরি করা হয়।

serviceInstance = serviceProvider.$get()

সিনট্যাক্স সরবরাহ করে পরিষেবা তৈরির জন্য নমুনা কোড:

var app= angular.module('myApp', []);
app.provider('providerPattern',function providerConstructor(){
  //this function works as constructor function for provider
  this.firstName = 'Arnold ';
  this.lastName = ' Schwarzenegger' ;
  this.greetMessage = ' Welcome, This is default Greeting Message' ;
  //adding some method which we can call in app.config() function
  this.setGreetMsg = function(msg){
    if(msg){
      this.greetMessage =  msg ;
    }
  };

  //We can also add a method which can change firstName and lastName
  this.$get = function(){
    var firstName = this.firstName;
    var lastName = this.lastName ;
    var greetMessage = this.greetMessage;
    var data={
       greet: function(){
         console.log('hello, ' + firstName + lastName+'! '+ greetMessage);
       }
    };
    return data ;
  };
});

app.config(
  function(providerPatternProvider){
    providerPatternProvider.setGreetMsg(' How do you do ?');
  }
);

ওয়ার্কিং ডেমো

সারসংক্ষেপ:


কারখানায় কোনও ফ্যাক্টরি ফাংশন ব্যবহার করা হয় যা কোনও পরিষেবার উদাহরণ দেয়। serviceInstance = fnFactory ();

পরিষেবাটি কনস্ট্রাক্টর ফাংশন ব্যবহার করে এবং কৌনিকটি পরিষেবাটির উদাহরণ তৈরির জন্য 'নতুন' কীওয়ার্ড ব্যবহার করে এই নির্মাণকারী ফাংশনটি আহ্বান করে। serviceInstance = নতুন fnServiceConstructor ();

সরবরাহকারী একটি সরবরাহকারী কনস্ট্রাক্টর ফাংশন সংজ্ঞায়িত করে, এই সরবরাহকারী কনস্ট্রাক্টর ফাংশন একটি কারখানার ফাংশন সংজ্ঞায়িত করে । পেতে । কৌণিক কলগুলি পরিষেবা অবজেক্ট তৈরি করতে $ get () করুন। সরবরাহকারীর সিনট্যাক্সটি ইনস্ট্যান্ট হওয়ার আগে পরিষেবা অবজেক্টটি কনফিগার করার একটি অতিরিক্ত সুবিধা রয়েছে। serviceInstance = $ get ();


87

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

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

এই চিত্রটি থেকে নিবন্ধটি এখানে:

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


63

কারখানা

আপনি অ্যাংুলারজেএসকে একটি ফাংশন দেন, কারখানার অনুরোধ করা হলে অ্যাংুলারজেএস ক্যাশে এবং রিটার্ন মানটি ইনজেক্ট করে।

উদাহরণ:

app.factory('factory', function() {
    var name = '';
    // Return value **is** the object that will be injected
    return {
        name: name;
    }
})

ব্যবহার:

app.controller('ctrl', function($scope, factory) {
     $scope.name = factory.name;
});

সেবা

আপনি AngularJS কে একটি ফাংশন দেন, AngularJS এটিকে ইনস্ট্যান্ট করতে নতুন কল করবে। এটি উদাহরণস্বরূপ যে AngularJS তৈরি করে যা পরিষেবাটি অনুরোধ করা হলে ক্যাশে এবং ইনজেকশনের ব্যবস্থা করা হবে। যেহেতু নতুন সেবা instantiate ব্যবহৃত হয়, অভিব্যক্তি এই বৈধ এবং উদাহরণস্বরূপ বোঝায়।

উদাহরণ:

app.service('service', function() {
     var name = '';
     this.setName = function(newName) {
         name = newName;
     }
     this.getName = function() {
         return name;
     }
});

ব্যবহার:

app.controller('ctrl', function($scope, service) {
   $scope.name = service.getName();
});

প্রদানকারী

আপনি AngularJS কে একটি ফাংশন দেন এবং AngularJS এর $getফাংশনটি কল করবে । $getপরিষেবাটি অনুরোধ করা হলে এটি ফাংশন থেকে ফেরত মান যা ক্যাশে এবং ইনজেকশনের ব্যবস্থা করা হবে।

অ্যাঙ্গুলারজেএস সংক্রামক হওয়ার জন্য $getপদ্ধতিটি কল করার আগে সরবরাহকারীরা আপনাকে সরবরাহকারীকে কনফিগার করতে দেয় ।

উদাহরণ:

app.provider('provider', function() {
     var name = '';
     this.setName = function(newName) {
          name = newName;
     }
     this.$get = function() {
         return {
            name: name
         }
     }
})

ব্যবহার (একটি নিয়ামক ইনজেকশন হিসাবে)

app.controller('ctrl', function($scope, provider) {
    $scope.name = provider.name;
});

ব্যবহার (আগে সরবরাহকারীর কনফিগারেশন $getইনজেক্টেবল তৈরি করতে বলা হয়)

app.config(function(providerProvider) {
    providerProvider.setName('John');
});

56

সরবরাহকারীদের সাথে চারপাশে খেলা করার সময় আমি আকর্ষণীয় কিছু লক্ষ্য করেছি।

ইনজেকটেবলের দৃশ্যমানতা পরিষেবা এবং কারখানার তুলনায় সরবরাহকারীর পক্ষে আলাদা। যদি আপনি একটি কৌণিক জেএস "ধ্রুবক" (উদাহরণস্বরূপ myApp.constant('a', 'Robert');) ঘোষণা করেন তবে আপনি এটি পরিষেবা, কারখানা এবং সরবরাহকারীগুলিতে ইনজেকশন করতে পারেন।

তবে আপনি যদি একটি কৌণিক জেএস "মান" (উদাহরণস্বরূপ,, myApp.value('b', {name: 'Jones'});) ঘোষণা করেন তবে আপনি এটিকে পরিষেবা এবং কারখানায় ইনজেক্ট করতে পারেন, তবে সরবরাহকারী তৈরির ফাংশনে নয়। আপনি তবে $getআপনার সরবরাহকারীর জন্য যে ফাংশনটি নির্ধারণ করেছেন তাতে এটি ইনজেক্ট করতে পারেন । এটি AngularJS ডকুমেন্টেশনে উল্লেখ করা হয়েছে, তবে এটি মিস করা সহজ। মান এবং ধ্রুবক পদ্ধতির বিভাগগুলিতে আপনি এটি% সরবরাহ পৃষ্ঠায় খুঁজে পেতে পারেন।

http://jsfiddle.net/R2Frv/1/

<div ng-app="MyAppName">
    <div ng-controller="MyCtrl">
        <p>from Service: {{servGreet}}</p>
        <p>from Provider: {{provGreet}}</p>
    </div>
</div>
<script>
    var myApp = angular.module('MyAppName', []);

    myApp.constant('a', 'Robert');
    myApp.value('b', {name: 'Jones'});

    myApp.service('greetService', function(a,b) {
        this.greeter = 'Hi there, ' + a + ' ' + b.name;
    });

    myApp.provider('greetProvider', function(a) {
        this.firstName = a;
        this.$get = function(b) {
            this.lastName = b.name;
            this.fullName = this.firstName + ' ' + this.lastName;
            return this;
        };
    });

    function MyCtrl($scope, greetService, greetProvider) {
        $scope.servGreet = greetService.greeter;
        $scope.provGreet = greetProvider.fullName;
    }
</script>

45

এটি নবজাতকের পক্ষে খুব বিভ্রান্তিকর অংশ এবং আমি এটি সহজ কথায় পরিষ্কার করার চেষ্টা করেছি

অ্যাঙ্গুলারজেএস পরিষেবা: নিয়ামকটিতে পরিষেবার রেফারেন্সের সাথে ইউটিলিটি ফাংশনগুলি ভাগ করে নেওয়ার জন্য ব্যবহৃত হয়। পরিষেবা প্রকৃতিতে সিঙ্গলটন তাই এক পরিষেবার জন্য ব্রাউজারে কেবল একটি উদাহরণ তৈরি করা হয় এবং একই পৃষ্ঠাগুলিতে একই রেফারেন্স ব্যবহৃত হয়।

পরিষেবাটিতে, আমরা এই বস্তুর সাথে সম্পত্তি হিসাবে ফাংশন নাম তৈরি করি ।

অ্যাঙ্গুলারজেএস ফ্যাক্টরি: কারখানার উদ্দেশ্যও পরিষেবা হিসাবে একই তবে এই ক্ষেত্রে আমরা একটি নতুন অবজেক্ট তৈরি করি এবং এই বস্তুর বৈশিষ্ট্য হিসাবে ফাংশন যুক্ত করি এবং শেষে আমরা এই বস্তুকে ফিরে পাই।

কৌণিক জেএস সরবরাহকারী: এর উদ্দেশ্য আবার একই same তবে প্রদানকারীর এর ফল। Get ফাংশন দেয় $

পরিষেবাদি, কারখানা ও সরবরাহকারীর সংজ্ঞা এবং ব্যবহারের বিষয়টি http://www.dotnetfunda.com/articles/show/3156/differences-between-angularjs-service-factory- and-provider- এ ব্যাখ্যা করা হয়েছে


2
কারখানা এবং সরবরাহকারীরা কি সিঙ্গলটন অবজেক্ট? কোনও স্ক্যানরিও যেখানে পরিষেবাগুলির চেয়ে কারখানার সুপারিশ করা হয়?
সুনীল গার্গ

34

আমার পক্ষে পার্থক্যটি বোঝার সর্বোত্তম এবং সহজ উপায় হ'ল:

var service, factory;
service = factory = function(injection) {}

অ্যাঙ্গুলারজেএস কীভাবে নির্দিষ্ট উপাদানগুলিকে ইনস্ট্যান্ট করে (সরলীকৃত):

// service
var angularService = new service(injection);

// factory
var angularFactory = factory(injection);

সুতরাং, পরিষেবার জন্য, যা AngularJS উপাদান হয়ে যায় তা হ'ল শ্রেণীর অবজেক্ট দৃষ্টান্ত যা পরিষেবা ঘোষণার ফাংশন দ্বারা প্রতিনিধিত্ব করা হয়। কারখানার জন্য, এটি কারখানার ঘোষণা ফাংশন থেকে ফিরে আসা ফলাফল। কারখানাটি সেবার মতো আচরণ করতে পারে:

var factoryAsService = function(injection) {
  return new function(injection) {
    // Service content
  }
}

সহজ চিন্তার উপায় নিম্নলিখিতটি:

  • পরিষেবাটি একটি একক বস্তুর উদাহরণ instance আপনি যদি আপনার কোডের জন্য একটি সিঙ্গলটন অবজেক্ট সরবরাহ করতে চান তবে পরিষেবাগুলি ব্যবহার করুন।
  • কারখানা একটি শ্রেণি। আপনি যদি আপনার কোডের জন্য কাস্টম ক্লাস সরবরাহ করতে চান তবে কারখানাগুলি ব্যবহার করুন (পরিষেবাগুলি দিয়ে সম্পন্ন করা যাবে না কারণ তারা ইতিমধ্যে তাত্ক্ষণিকভাবে রয়েছে)।

ফ্যাক্টরি 'শ্রেণি' উদাহরণ চারপাশের মন্তব্যে সরবরাহ করা হয়, পাশাপাশি সরবরাহকারীর পার্থক্য।


যদি কোনও পরিষেবা এটি ব্যবহারের সময় তাত্ক্ষণিকভাবে আসে তবে কীভাবে সিঙ্গলটন হতে পারে? আমি তার চারপাশে আমার মাথা পেতে পারি ...
জো

নির্ভরতা সমাধানের সময় পরিষেবাটি একবারে ইনস্ট্যান্ট করা হয় এবং তারপরে আপনি যখন ইঞ্জেক্টরের কাছ থেকে পরিষেবাটি চান, আপনি সর্বদা একই নজরে আসছেন। এটি সহজেই এখানে চেক করা যায়: jsfiddle.net/l0co/sovtu55t/1 , দয়া করে এটি কনসোল দিয়ে চালান। কনসোল দেখায় যে পরিষেবাটি একবারে ইনস্ট্যান্ট করা হয়।
লুকাসজ ফ্রাঙ্কোভস্কি

আচ্ছা বুঝলাম. আমি আক্ষরিক new MyService()বা কিছু করতে সক্ষম হবেন বলে আশা করছিলাম :)
জো

33

এই বিষয়ে আমার স্পষ্টতা:

মূলত উল্লিখিত সমস্ত ধরণের (পরিষেবাদি, কারখানা, সরবরাহকারী ইত্যাদি) কেবলমাত্র বিশ্বব্যাপী ভেরিয়েবলগুলি তৈরি এবং কনফিগার করছে (এটি অবশ্যই পুরো প্রয়োগের ক্ষেত্রে বৈশ্বিক) ঠিক যেমন পুরানো ফ্যাশনযুক্ত বৈশ্বিক চলক ছিল ables

যদিও বৈশ্বিক ভেরিয়েবলগুলি প্রস্তাবিত নয়, তবে এই গ্লোবাল ভেরিয়েবলগুলির আসল ব্যবহার হ'ল নির্ভরশীলতা নিয়ন্ত্রকের কাছে ভেরিয়েবল পাস করে নির্ভরতা ইনজেকশন সরবরাহ করা

"গ্লোবাল ভেরিয়েবল" এর মান তৈরিতে বিভিন্ন স্তরের জটিলতা রয়েছে:

  1. ধ্রুবক
    এটি একটি আসল ধ্রুবককে সংজ্ঞায়িত করে যা পুরো অ্যাপ্লিকেশন চলাকালীন পরিবর্তিত হওয়া উচিত নয়, ঠিক যেমন অন্যান্য ভাষায় ধ্রুবকরা (জাভাস্ক্রিপ্টের অভাবের এমন কিছু)।
  2. মান
    এটি একটি সংশোধনযোগ্য মান বা অবজেক্ট এবং এটি কিছু বৈশ্বিক পরিবর্তনশীল হিসাবে কাজ করে, যা অন্যান্য পরিষেবা বা কারখানা তৈরি করার সময় এমনকি ইনজেকশনেও পড়তে পারে (এগুলিতে আরও দেখুন)। তবে এটি অবশ্যই একটি " আক্ষরিক মান " হওয়া উচিত যার অর্থ হ'ল একজনকে আসল মানটি লিখতে হবে এবং কোনও গণনা বা প্রোগ্রামিং যুক্তি ব্যবহার করতে পারবেন না (অন্য কথায় 39 বা মাই টেক্সট বা {প্রোপ: "মান" OK ঠিক আছে, তবে 2 +2 হয় না)।
  3. কারখানা
    আরও সাধারণ মূল্য, এটি এখনই গণনা করা সম্ভব। এটি মান গণনা করার জন্য প্রয়োজনীয় যুক্তি দিয়ে AngularJS এ একটি ক্রিয়াকলাপটি পাঠিয়ে কাজ করে এবং AngularJS এটি কার্যকর করে, এবং এটি নামক ভেরিয়েবলের মধ্যে ফেরতের মান সংরক্ষণ করে।
    নোট করুন যে কোনও বস্তু (যে ক্ষেত্রে এটি কোনও পরিষেবার অনুরূপ কাজ করবে ) বা কোনও ফাংশন (যা কলব্যাক ফাংশন হিসাবে ভেরিয়েলে সংরক্ষণ করা হবে) ফেরত পাওয়া সম্ভব Note
  4. পরিষেবাদি
    একটি পরিষেবা কারখানার আরও স্ট্রিপড ডাউন সংস্করণ যা কেবলমাত্র মানটি যখন অবৈধ হয় তখন বৈধ হয় এবং এটি সরাসরি ফাংশনে কোনও যুক্তি (যেমন এটি নির্মাতা হবে) লেখার পাশাপাশি অনুমতি এবং অ্যাক্সেসের অনুমতি দেয় এই কীওয়ার্ডটি ব্যবহার করে অবজেক্টের বৈশিষ্ট্য ।
  5. সরবরাহকারী
    এমন একটি পরিষেবাদির বিপরীতে যা কারখানার সরল সংস্করণ , একটি সরবরাহকারী আরও জটিল, তবে "গ্লোবাল" ভেরিয়েবলগুলির সূচনা করার আরও নমনীয় উপায়, যার মধ্যে বৃহত্তম নমনীয়তাটি অ্যাপকনফাইগ থেকে মান নির্ধারণের বিকল্প being
    এটি পরিষেবা এবং সরবরাহকারীর সংমিশ্রণটি ব্যবহার করার মতো কাজ করে , সরবরাহকারীর কাছে এমন একটি ক্রিয়াকলাপটি প্রেরণ করে যা এই কীওয়ার্ড ব্যবহার করে বৈশিষ্ট্যযুক্ত বলে ঘোষণা করা হয় , যা থেকে ব্যবহার করা যেতে পারে app.config
    তারপরে এটির একটি পৃথক get .get ফাংশন থাকা দরকার যা উপরের বৈশিষ্ট্যগুলি app.configফাইলের মাধ্যমে সেট করার পরে অ্যাংুলারজেএস দ্বারা সম্পাদন করা হয় এবং এই $ .get ফাংশনটি কারখানার মতোই আচরণ করে উপরের দিকে, এর রিটার্ন মানটি "গ্লোবাল" ভেরিয়েবলগুলি আরম্ভ করার জন্য ব্যবহৃত হয়।

26

আমার বোঝার নীচে খুব সহজ।

কারখানা: আপনি কেবল কারখানার অভ্যন্তর কোনও বস্তু তৈরি করে তা ফিরিয়ে দিন।

সার্ভিস:

আপনার কেবলমাত্র একটি স্ট্যান্ডার্ড ফাংশন রয়েছে যা কোনও ফাংশন সংজ্ঞায়িত করতে এই কীওয়ার্ডটি ব্যবহার করে।

প্রদানকারী:

এমন একটি $getবস্তু রয়েছে যা আপনি সংজ্ঞায়িত করেন এবং এটি অবজেক্টটি ডেটা ফেরত পেতে ব্যবহার করা যেতে পারে।


আপনি কারখানা এবং পরিষেবা মিশ্রিত করেন নি? পরিষেবাগুলি তৈরি করে যেখানে ফ্যাক্টরি ফিরে আসে।
ফ্ল্যাভিয়ান ভলকেন

আপনি যখন সার্ভিসের নামটিকে ইনজেক্টেবল আর্গুমেন্ট হিসাবে ঘোষণা করেন তখন আপনাকে ফাংশনের একটি উদাহরণ সরবরাহ করা হবে। অন্য কথায় নতুন ফাংশন YouPassedToS सर्विस ()। এই অবজেক্ট ইনস্ট্যান্সটি সে পরিষেবা অবজেক্টে পরিণত হয় যা AngularJS রেজিস্ট্রেশন করে এবং পরে প্রয়োজনে অন্যান্য পরিষেবা / নিয়ন্ত্রণকারীগুলিকে ইনজেকশন দেয়। // ফ্যাক্টরি আপনি যখন কারখানার নামটিকে ইনজেকশনযোগ্য আর্গুমেন্ট হিসাবে ঘোষণা করেন তখন আপনাকে সেই মানটি সরবরাহ করা হবে যা ফাংশন রেফারেন্সটি মডিউল.ফ্যাক্টরিতে পাস করে ফিরে আসে by
সজন

ঠিক আছে, সুতরাং ... কৌণিকভাবে কারখানাটি একটি সিঙ্গলটন যেখানে "পরিষেবা" আসলে একটি কারখানা হয় (সাধারণ নকশার নিদর্শন অনুসারে)
ফ্ল্যাভিয়ান ভোলকেন

25

কৌণিক ডক্স থেকে সংক্ষিপ্তসার :

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

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


এসও থেকে সেরা উত্তর:

https://stackoverflow.com/a/26924234/165673 (<- GOOD) https://stackoverflow.com/a/27263882/165673
https://stackoverflow.com/a/16566144/165673


20

ইতিমধ্যে সমস্ত ভাল উত্তর। আমি পরিষেবা এবং কারখানায় আরও কয়েকটি পয়েন্ট যুক্ত করতে চাই । পরিষেবা / কারখানার মধ্যে পার্থক্য সহ। এবং কারওর মতো প্রশ্নও থাকতে পারে:

  1. আমার কি পরিষেবা বা কারখানা ব্যবহার করা উচিত? পার্থক্য কি?
  2. তারা কি একই রকম বা একই আচরণ করে?

পরিষেবা এবং কারখানার মধ্যে পার্থক্য দিয়ে শুরু করা যাক:

  1. উভয়ই সিঙ্গেলন : যখনই কৌণিক প্রথমবার এটিকে নির্ভরতা হিসাবে আবিষ্কার করে, এটি পরিষেবা / কারখানার একক উদাহরণ তৈরি করে। উদাহরণটি তৈরি হয়ে গেলে, একই উদাহরণ চিরকালের জন্য ব্যবহৃত হয়।

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

সেবা:

একটি পরিষেবাদি একটি কনস্ট্রাক্টর ফাংশন, এবং কৌনিকটি এটি নতুন কল করে তা ইনস্ট্যান্ট করে দেবে yourServiceName()। এর অর্থ কয়েকটি জিনিস।

  1. ফাংশন এবং উদাহরণ ভেরিয়েবল এর বৈশিষ্ট্য হবে this
  2. আপনার কোনও মান ফেরত দেওয়ার দরকার নেই। যখন কৌনিক কল করে new yourServiceName(), এটি আপনার দেওয়া thisসমস্ত বৈশিষ্ট্যগুলির সাথে এটি বস্তুটি গ্রহণ করবে।

উদাহরণ উদাহরণ:

angular.service('MyService', function() {
  this.aServiceVariable = "Ved Prakash"
  this.aServiceMethod = function() {
    return //code
  };
});

যখন কৌণিক এই MyServiceপরিষেবাটিকে নির্ভর করে এমন একটি নিয়ামক হিসাবে সংযুক্ত করে, তখন সেই নিয়ামক এমন একটি পাবেন MyServiceযা এটি ফাংশনগুলিতে কল করতে পারে, যেমন মাই সার্ভিস.এএসওয়ারস্মিথড ()।

সাবধানthis :

যেহেতু তৈরি পরিষেবাটি একটি অবজেক্ট তাই এর অভ্যন্তরীণ পদ্ধতিগুলি যখন তাদের ডাকা হয় তখন এটি উল্লেখ করতে পারে:

angular.service('ScoreKeeper', function($http) {
  this.score = 0;

  this.getScore = function() {
    return this.score;
  };

  this.setScore = function(newScore) {
    this.score = newScore;
  };

  this.addOne = function() {
    this.score++;
  };
});

আপনাকে কল করার প্রলুব্ধ করা যেতে পারে ScoreKeeper.setScore, একটি প্রতিশ্রুতি চেন উদাহরণস্বরূপ যদি আপনি এটি সার্ভার থেকে দখল করে স্কোর সক্রিয়া: $http.get('/score').then(ScoreKeeper.setScore).এই সঙ্গে ঝামেলায় যে ScoreKeeper.setScoreসঙ্গে বলা হবে thisআবদ্ধ nullএবং আপনি ত্রুটি পাবেন। আরও ভাল উপায় হবে $http.get('/score').then(ScoreKeeper.setScore.bind(ScoreKeeper))। আপনি আপনার পরিষেবা পদ্ধতিতে এটি ব্যবহার করা চয়ন করুন বা না করুন, কীভাবে আপনি এগুলি ডাকেন সে সম্পর্কে সতর্ক থাকুন।

একটি থেকে একটি মান ফেরত দেওয়াService :

জাভাস্ক্রিপ্ট কনস্ট্রাক্টররা কীভাবে কাজ করে তার কারণে আপনি যদি (i.e., an Object)কোনও constructorফাংশন থেকে কোনও জটিল মান ফিরিয়ে দেন, কলকারী এই দৃষ্টান্তটির পরিবর্তে সেই বস্তুটি পাবেন।

এর অর্থ হ'ল আপনি নীচে থেকে কারখানার উদাহরণটি মূলত কপি-পেস্ট করতে পারেন, এর সাথে প্রতিস্থাপন factoryকরতে পারেন serviceএবং এটি কার্যকর হবে:

angular.service('MyService', function($http) {
  var api = {};

  api.aServiceMethod= function() {
    return $http.get('/users');
  };
  return api;
});

সুতরাং যখন কৌনিক আপনার পরিষেবাটি নতুন মাই সার্ভিস () দিয়ে তৈরি করবে, তখন এটি মাই সার্ভিস উদাহরণের পরিবর্তে সেই এপিআই বস্তুটি পেয়ে যাবে।

এটি কোনও জটিল মানের জন্য আচরণ (বস্তু, ফাংশন) তবে আদিম ধরণের নয়।

কারখানা:

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

angular.factory('MyFactory', function($http) {
  var api = {};

  api.aFactoryMethod= function() {
    return $http.get('/users');
  };

  return api;
});

কারখানার নির্ভরতার জন্য ইঞ্জেকশনের মান হ'ল কারখানার রিটার্ন মান, এবং এটি কোনও বস্তু হতে হবে না। এটি একটি ফাংশন হতে পারে

উপরে 1 এবং 2 টি প্রশ্নের উত্তর:

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

যদিও আমি তাদের নির্ভরতা হিসাবে ইনজেকশনের কথা বলছি তখনও আমি তাদের "পরিষেবা" হিসাবে উল্লেখ করি as

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


16

একটি অতিরিক্ত স্পষ্টতা হ'ল কারখানাগুলি ফাংশন / আদিম তৈরি করতে পারে, যখন পরিষেবাগুলি পারে না। এপোক্কের উপর ভিত্তি করে এই জেএসফিডেলটি দেখুন : http://jsfiddle.net/skeller88/PxdSP/1351/

কারখানাটি একটি ফাংশন ফিরিয়ে দেয় যা আহবান করা যেতে পারে:

myApp.factory('helloWorldFromFactory', function() {
  return function() {
    return "Hello, World!";
  };
});

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

myApp.factory('helloWorldFromFactory', function() {
  return {
    sayHello: function() {
      return "Hello, World!";
    }
  };
});

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

myApp.service('helloWorldFromService', function() {
  this.sayHello = function() {
     return "Hello, World!";
  };
});

আরও তথ্যের জন্য, আমি পার্থক্য নিয়ে লিখেছি একটি পোস্ট দেখুন: http://www.shanemkeller.com/tldr-services-vs-factories-in-angular/


16

ইতিমধ্যে ভাল উত্তর আছে, কিন্তু আমি কেবল এই একটি ভাগ করতে চান।

প্রথমত: সরবরাহকারী একটি তৈরির উপায় / রেসিপিservice (সিঙ্গলটন অবজেক্ট) যা ধরুন $ ইনজেক্টর দ্বারা ইনজেকশন দেওয়া হয় (অ্যাঙ্গুলাএস কীভাবে আইওসি প্যাটার্ন সম্পর্কে যায়)।

এবং মান, কারখানা, পরিষেবা এবং ধ্রুবক (4 টি উপায়) - সরবরাহকারী উপায় / রিসিপির উপরে সিনট্যাকটিক চিনি ।

নেই Service vs Factoryঅংশ আবৃত করা হয়েছে: https://www.youtube.com/watch?v=BLzNCkPn3ao

পরিষেবা সম্পর্কে সব হয় newশব্দ আসলে যা আমরা জানি 4 জিনিস আছে:

  1. একেবারে নতুন অবজেক্ট তৈরি করে
  2. এটি তার prototypeবস্তুর সাথে লিঙ্ক করে
  3. সংযোগ স্থাপন করে contextথেকেthis
  4. এবং ফিরে this

এবং ফ্যাক্টরি সমস্ত ফ্যাক্টরি প্যাটার্ন সম্পর্কে - এতে এমন ফাংশন রয়েছে যা সেবার মতো অবজেক্টগুলিকে ফিরিয়ে দেয়।

  1. অন্যান্য পরিষেবাদি ব্যবহারের ক্ষমতা (নির্ভরতা রয়েছে)
  2. পরিষেবা সূচনা
  3. বিলম্ব / অলস সূচনা

এবং এই সহজ / সংক্ষিপ্ত ভিডিও: সরবরাহকারীকেও কভার করে : https://www.youtube.com/watch?v=HvTZbQ_hUZY (সেখানে আপনি দেখতে পারেন তারা কীভাবে কারখানায় সরবরাহকারী হয়)

সরবরাহকারীর রেসিপিটি অ্যাপটি সম্পূর্ণরূপে শুরু / আরম্ভ করার আগে অ্যাপ্লিকেশন কনফিগারেশনে ব্যবহৃত হয়।


14

এই সমস্ত পোস্ট পড়ার পরে এটি আমার জন্য আরও বিভ্রান্তি তৈরি করেছে .. তবে এখনও সমস্ত মূল্যবান তথ্য .. অবশেষে আমি নীচের সারণীটি পেয়েছি যা সাধারণ তুলনার সাথে তথ্য দেবে

  • ইনজেক্টর দুটি ধরণের অবজেক্ট তৈরির জন্য রেসিপি ব্যবহার করে: পরিষেবা এবং বিশেষ উদ্দেশ্যে বস্তু
  • পাঁচটি রেসিপি প্রকার রয়েছে যা সংজ্ঞা দেয় কীভাবে বস্তু তৈরি করতে হয়: মান, কারখানা, পরিষেবা, সরবরাহকারী এবং ধ্রুবক Const
  • কারখানা এবং পরিষেবা হ'ল সর্বাধিক ব্যবহৃত রেসিপি। তাদের মধ্যে একমাত্র পার্থক্য হ'ল পরিষেবা রেসিপিটি কোনও কাস্টম ধরণের জিনিসগুলির জন্য আরও ভাল কাজ করে, যখন কারখানাটি জাভাস্ক্রিপ্টের আদিম এবং কার্যাদি তৈরি করতে পারে।
  • সরবরাহকারী রেসিপি হ'ল মূল রেসিপি টাইপ এবং অন্যান্য সমস্তগুলি কেবলমাত্র সিনট্যাকটিক চিনির উপর রয়েছে।
  • সরবরাহকারী সবচেয়ে জটিল রেসিপি টাইপ। আপনার প্রয়োজন নেই যদি না আপনি বিশ্বব্যাপী কনফিগারেশন প্রয়োজন এমন কোডের পুনরায় ব্যবহারযোগ্য টুকরো তৈরি না করে।
  • কন্ট্রোলার ব্যতীত সমস্ত বিশেষ উদ্দেশ্য বিষয়গুলি কারখানার রেসিপিগুলির মাধ্যমে সংজ্ঞায়িত করা হয়।

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

এবং শিক্ষানবিশদের জন্য বুঝতে: - এটি ব্যবহারের ক্ষেত্রে সঠিক হতে পারে না তবে উচ্চ স্তরে এই তিনটির ক্ষেত্রে ইউজকেস রয়েছে।

  1. আপনি যদি কৌণিক মডিউল কনফিগার ফাংশন ব্যবহার করতে চান তবে সরবরাহকারী হিসাবে তৈরি করা উচিত

angular.module('myApp').config(function($testProvider){
$testProvider.someFunction();
})

  1. আজাক্স কল বা তৃতীয় পক্ষের সমন্বয়ের পরিষেবা হওয়া দরকার
  2. ডেটা ম্যানিপুলেশনগুলির জন্য এটিকে কারখানা হিসাবে তৈরি করুন

মৌলিক পরিস্থিতিতে কারখানা ও পরিষেবা একই আচরণ করে।


13

এখানে কিছু ব্রয়লারপ্ল্যাট কোড যা আমি AngularjS এ অবজেক্ট ফ্যাক্টরির জন্য একটি কোড-টেমপ্লেট হিসাবে নিয়ে এসেছি। উদাহরণস্বরূপ আমি একটি গাড়ি / কারখানা ব্যবহার করেছি। নিয়ামকটিতে সাধারণ প্রয়োগের কোড তৈরি করে।

     <script>
        angular.module('app', [])
            .factory('CarFactory', function() {

                /**
                 * BroilerPlate Object Instance Factory Definition / Example
                 */
                this.Car = function() {

                    // initialize instance properties
                    angular.extend(this, {
                        color           : null,
                        numberOfDoors   : null,
                        hasFancyRadio   : null,
                        hasLeatherSeats : null
                    });

                    // generic setter (with optional default value)
                    this.set = function(key, value, defaultValue, allowUndefined) {

                        // by default,
                        if (typeof allowUndefined === 'undefined') {
                            // we don't allow setter to accept "undefined" as a value
                            allowUndefined = false;
                        }
                        // if we do not allow undefined values, and..
                        if (!allowUndefined) {
                            // if an undefined value was passed in
                            if (value === undefined) {
                                // and a default value was specified
                                if (defaultValue !== undefined) {
                                    // use the specified default value
                                    value = defaultValue;
                                } else {
                                    // otherwise use the class.prototype.defaults value
                                    value = this.defaults[key];
                                } // end if/else
                            } // end if
                        } // end if

                        // update 
                        this[key] = value;

                        // return reference to this object (fluent)
                        return this;

                    }; // end this.set()

                }; // end this.Car class definition

                // instance properties default values
                this.Car.prototype.defaults = {
                    color: 'yellow',
                    numberOfDoors: 2,
                    hasLeatherSeats: null,
                    hasFancyRadio: false
                };

                // instance factory method / constructor
                this.Car.prototype.instance = function(params) {
                    return new 
                        this.constructor()
                                .set('color',           params.color)
                                .set('numberOfDoors',   params.numberOfDoors)
                                .set('hasFancyRadio',   params.hasFancyRadio)
                                .set('hasLeatherSeats', params.hasLeatherSeats)
                    ;
                };

                return new this.Car();

            }) // end Factory Definition
            .controller('testCtrl', function($scope, CarFactory) {

                window.testCtrl = $scope;

                // first car, is red, uses class default for:
                // numberOfDoors, and hasLeatherSeats
                $scope.car1     = CarFactory
                                    .instance({
                                        color: 'red'
                                    })
                                ;

                // second car, is blue, has 3 doors, 
                // uses class default for hasLeatherSeats
                $scope.car2     = CarFactory
                                    .instance({
                                        color: 'blue',
                                        numberOfDoors: 3
                                    })
                                ;
                // third car, has 4 doors, uses class default for 
                // color and hasLeatherSeats
                $scope.car3     = CarFactory
                                    .instance({
                                        numberOfDoors: 4
                                    })
                                ;
                // sets an undefined variable for 'hasFancyRadio',
                // explicitly defines "true" as default when value is undefined
                $scope.hasFancyRadio = undefined;
                $scope.car3.set('hasFancyRadio', $scope.hasFancyRadio, true);

                // fourth car, purple, 4 doors,
                // uses class default for hasLeatherSeats
                $scope.car4     = CarFactory
                                    .instance({
                                        color: 'purple',
                                        numberOfDoors: 4
                                    });
                // and then explicitly sets hasLeatherSeats to undefined
                $scope.hasLeatherSeats = undefined;
                $scope.car4.set('hasLeatherSeats', $scope.hasLeatherSeats, undefined, true);

                // in console, type window.testCtrl to see the resulting objects

            });
    </script>

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

    angular.module('app')
.factory('PositionFactory', function() {

    /**
     * BroilerPlate Object Instance Factory Definition / Example
     */
    this.Position = function() {

        // initialize instance properties 
        // (multiple properties to satisfy multiple external interface contracts)
        angular.extend(this, {
            lat         : null,
            lon         : null,
            latitude    : null,
            longitude   : null,
            coords: {
                latitude: null,
                longitude: null
            }
        });

        this.setLatitude = function(latitude) {
            this.latitude           = latitude;
            this.lat                = latitude;
            this.coords.latitude    = latitude;
            return this;
        };
        this.setLongitude = function(longitude) {
            this.longitude          = longitude;
            this.lon                = longitude;
            this.coords.longitude   = longitude;
            return this;
        };

    }; // end class definition

    // instance factory method / constructor
    this.Position.prototype.instance = function(params) {
        return new 
            this.constructor()
                    .setLatitude(params.latitude)
                    .setLongitude(params.longitude)
        ;
    };

    return new this.Position();

}) // end Factory Definition

.controller('testCtrl', function($scope, PositionFactory) {
    $scope.position1 = PositionFactory.instance({latitude: 39, longitude: 42.3123});
    $scope.position2 = PositionFactory.instance({latitude: 39, longitude: 42.3333});
}) // end controller

;


12

রেফারেন্স হিসাবে এই পৃষ্ঠাটি এবং ডকুমেন্টেশন ব্যবহার করে (যা দেখেছি গতবারের চেয়ে অনেক উন্নতি হয়েছে বলে মনে হচ্ছে), আমি নীচের আসল (-শ) ওয়ার্ল্ড ডেমোকে একসাথে রেখেছি যা 5 টি স্বাদ সরবরাহকারীর 4 ব্যবহার করে; মান, ধ্রুবক, কারখানা এবং পূর্ণ বিকাশ সরবরাহকারী।

এইচটিএমএল:

<div ng-controller="mainCtrl as main">
    <h1>{{main.title}}*</h1>
    <h2>{{main.strapline}}</h2>
    <p>Earn {{main.earn}} per click</p>
    <p>You've earned {{main.earned}} by clicking!</p>
    <button ng-click="main.handleClick()">Click me to earn</button>
    <small>* Not actual money</small>
</div>

অ্যাপ্লিকেশন

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

// A CONSTANT is not going to change
app.constant('range', 100);

// A VALUE could change, but probably / typically doesn't
app.value('title', 'Earn money by clicking');
app.value('strapline', 'Adventures in ng Providers');

// A simple FACTORY allows us to compute a value @ runtime.
// Furthermore, it can have other dependencies injected into it such
// as our range constant.
app.factory('random', function randomFactory(range) {
    // Get a random number within the range defined in our CONSTANT
    return Math.random() * range;
});

// A PROVIDER, must return a custom type which implements the functionality 
// provided by our service (see what I did there?).
// Here we define the constructor for the custom type the PROVIDER below will 
// instantiate and return.
var Money = function(locale) {

    // Depending on locale string set during config phase, we'll
    // use different symbols and positioning for any values we 
    // need to display as currency
    this.settings = {
        uk: {
            front: true,
            currency: '£',
            thousand: ',',
            decimal: '.'
        },
        eu: {
            front: false,
            currency: '€',
            thousand: '.',
            decimal: ','
        }
    };

    this.locale = locale;
};

// Return a monetary value with currency symbol and placement, and decimal 
// and thousand delimiters according to the locale set in the config phase.
Money.prototype.convertValue = function(value) {

    var settings = this.settings[this.locale],
        decimalIndex, converted;

    converted = this.addThousandSeparator(value.toFixed(2), settings.thousand);

    decimalIndex = converted.length - 3;

    converted = converted.substr(0, decimalIndex) +
        settings.decimal +
        converted.substr(decimalIndex + 1);    

    converted = settings.front ?
            settings.currency + converted : 
            converted + settings.currency; 

    return converted;   
};

// Add supplied thousand separator to supplied value
Money.prototype.addThousandSeparator = function(value, symbol) {
   return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, symbol);
};

// PROVIDER is the core recipe type - VALUE, CONSTANT, SERVICE & FACTORY
// are all effectively syntactic sugar built on top of the PROVIDER construct
// One of the advantages of the PROVIDER is that we can configure it before the
// application starts (see config below).
app.provider('money', function MoneyProvider() {

    var locale;

    // Function called by the config to set up the provider
    this.setLocale = function(value) {
        locale = value;   
    };

    // All providers need to implement a $get method which returns
    // an instance of the custom class which constitutes the service
    this.$get = function moneyFactory() {
        return new Money(locale);
    };
});

// We can configure a PROVIDER on application initialisation.
app.config(['moneyProvider', function(moneyProvider) {
    moneyProvider.setLocale('uk');
    //moneyProvider.setLocale('eu'); 
}]);

// The ubiquitous controller
app.controller('mainCtrl', function($scope, title, strapline, random, money) {

    // Plain old VALUE(s)
    this.title = title;
    this.strapline = strapline;

    this.count = 0;

    // Compute values using our money provider    
    this.earn = money.convertValue(random); // random is computed @ runtime
    this.earned = money.convertValue(0);

    this.handleClick = function() { 
        this.count ++;
        this.earned = money.convertValue(random * this.count);
    };
});

ওয়ার্কিং ডেমো


12

এই উত্তরটি বিষয় / প্রশ্নের ঠিকানা দেয়

কীভাবে কারখানা, পরিষেবা এবং ধ্রুবক - সরবরাহকারীর রেসিপিটির উপরে কেবল সিনট্যাকটিক চিনি রয়েছে?

অথবা

কীভাবে কারখানা, সার্ভিক এবং সরবরাহকারীরা অভ্যন্তরীণভাবে সিমিলার

মূলত যা হয় তা হ'ল

যখন আপনি একটি করতে factory()এটা সেট করে আপনি functionপ্রদানকারীর দ্বিতীয় যুক্তি প্রদান করা $getএবং এটি (আগমন provider(name, {$get:factoryFn })), সব হল আপনি providerকিন্তু কোন সম্পত্তি / পদ্ধতি ছাড়া অন্য$get যে provider(মানে আপনি এই কনফিগার করা যাবে না)

কারখানার উত্স কোড

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

যখন একটি উপার্জন service()এটি আপনি একটি সঙ্গে একটি (কারখানা) সরবরাহ আসতে functionযে উদ্বুদ্ধ constructorএবং এটি আয় (কন্সট্রাকটর আপনি আপনার সেবা প্রদান করা দৃষ্টান্ত আগমন)

উত্স পরিষেবার কোড

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

সুতরাং মূলত উভয় ক্ষেত্রেই আপনি একটি সরবরাহকারী পাবেন - আপনার প্রদত্ত ফাংশনটি সেট করুন, তবে আপনি কনফিগারেশন ব্লকের জন্য মূলত সরবরাহকারী () সরবরাহ করতে পারবেন তার চেয়ে বেশি কিছু দিতে পারেন $


11

আমি চমৎকার উত্তর অনেকটা জানি কিন্তু আমি ব্যবহার আমার অভিজ্ঞতা শেয়ার করতে আছে
1. serviceডিফল্ট বেশিরভাগ ক্ষেত্রেই জন্য
2. factoryসেবা নির্দিষ্ট উদাহরণস্বরূপ যে তৈরি করতে ব্যবহার করা

// factory.js ////////////////////////////
(function() {
'use strict';
angular
    .module('myApp.services')
    .factory('xFactory', xFactoryImp);
xFactoryImp.$inject = ['$http'];

function xFactoryImp($http) {
    var fac = function (params) {
        this._params = params; // used for query params
    };

    fac.prototype.nextPage = function () {
        var url = "/_prc";

        $http.get(url, {params: this._params}).success(function(data){ ...
    }
    return fac;
}
})();

// service.js //////////////////////////
(function() {
'use strict';
angular
    .module('myApp.services')
    .service('xService', xServiceImp);
xServiceImp.$inject = ['$http'];

function xServiceImp($http) {  
    this._params = {'model': 'account','mode': 'list'};

    this.nextPage = function () {
        var url = "/_prc";

        $http.get(url, {params: this._params}).success(function(data){ ...
    }       
}
})();

এবং ব্যবহার:

controller: ['xFactory', 'xService', function(xFactory, xService){

        // books = new instance of xFactory for query 'book' model
        var books = new xFactory({'model': 'book', 'mode': 'list'});

        // accounts = new instance of xFactory for query 'accounts' model
        var accounts = new xFactory({'model': 'account', 'mode': 'list'});

        // accounts2 = accounts variable
        var accounts2 = xService;
... 

10

পার্টিতে একটু দেরি। তবে আমি ভেবেছিলাম কারখানা, পরিষেবা এবং সরবরাহকারীর পদ্ধতি ব্যবহার করে কৌণিক জেএস কাস্টম পরিষেবাদি বিকাশের বিষয়ে কারা জানতে (বা স্পষ্টতা থাকতে হবে) এর জন্য এটি আরও সহায়ক।

আমি এই ভিডিওটি জুড়ে এসেছি যা AngularJS কাস্টম পরিষেবাদি বিকাশের জন্য কারখানা, পরিষেবা এবং সরবরাহকারীর পদ্ধতি সম্পর্কে স্পষ্টভাবে ব্যাখ্যা করে:

https://www.youtube.com/watch?v=oUXku28ex-M

উত্স কোড: http://www.techcbt.com/ পোস্ট / 353 / Angular- JS-basics/ how-to-develop-angularjs-custom-service

পাঠকদের উপকারের জন্য এখানে পোস্ট করা কোডটি উপরের উত্স থেকে সরাসরি অনুলিপি করা হয়।

"ফ্যাক্টরি" ভিত্তিক কাস্টম পরিষেবাদির কোডটি নীচে রয়েছে (যা HTTP পরিষেবা কল করার পাশাপাশি উভয় সিঙ্ক এবং অ্যাসিঙ্ক সংস্করণে যায়):

var app = angular.module("app", []);
app.controller('emp', ['$scope', 'calcFactory',
  function($scope, calcFactory) {
    $scope.a = 10;
    $scope.b = 20;

    $scope.doSum = function() {
      //$scope.sum = calcFactory.getSum($scope.a, $scope.b); //synchronous
      calcFactory.getSum($scope.a, $scope.b, function(r) { //aynchronous
        $scope.sum = r;
      });
    };

  }
]);

app.factory('calcFactory', ['$http', '$log',
  function($http, $log) {
    $log.log("instantiating calcFactory..");
    var oCalcService = {};

    //oCalcService.getSum = function(a,b){
    //	return parseInt(a) + parseInt(b);
    //};

    //oCalcService.getSum = function(a, b, cb){
    //	var s = parseInt(a) + parseInt(b);
    //	cb(s);
    //};

    oCalcService.getSum = function(a, b, cb) { //using http service

      $http({
        url: 'http://localhost:4467/Sum?a=' + a + '&b=' + b,
        method: 'GET'
      }).then(function(resp) {
        $log.log(resp.data);
        cb(resp.data);
      }, function(resp) {
        $log.error("ERROR occurred");
      });
    };

    return oCalcService;
  }
]);

কাস্টম পরিষেবাদির জন্য "পরিষেবা" পদ্ধতির কোড (এটি 'ফ্যাক্টরি'র সাথে বেশ মিল, তবে সিনট্যাক্সের দৃষ্টিকোণ থেকে পৃথক):

var app = angular.module("app", []);
app.controller('emp', ['$scope', 'calcService', function($scope, calcService){
	$scope.a = 10;
	$scope.b = 20;

	$scope.doSum = function(){
		//$scope.sum = calcService.getSum($scope.a, $scope.b);
		
		calcService.getSum($scope.a, $scope.b, function(r){
			$scope.sum = r;
		});		
	};

}]);

app.service('calcService', ['$http', '$log', function($http, $log){
	$log.log("instantiating calcService..");
	
	//this.getSum = function(a,b){
	//	return parseInt(a) + parseInt(b);
	//};

	//this.getSum = function(a, b, cb){
	//	var s = parseInt(a) + parseInt(b);
	//	cb(s);
	//};

	this.getSum = function(a, b, cb){
		$http({
			url: 'http://localhost:4467/Sum?a=' + a + '&b=' + b,
			method: 'GET'
		}).then(function(resp){
			$log.log(resp.data);
			cb(resp.data);
		},function(resp){
			$log.error("ERROR occurred");
		});
	};

}]);

কাস্টম পরিষেবাদির জন্য "সরবরাহকারী" পদ্ধতিটির কোড (এটি প্রয়োজনীয়, যদি আপনি এমন পরিষেবা বিকাশ করতে চান যা কনফিগার করা যেতে পারে):

var app = angular.module("app", []);
app.controller('emp', ['$scope', 'calcService', function($scope, calcService){
	$scope.a = 10;
	$scope.b = 20;

	$scope.doSum = function(){
		//$scope.sum = calcService.getSum($scope.a, $scope.b);
		
		calcService.getSum($scope.a, $scope.b, function(r){
			$scope.sum = r;
		});		
	};

}]);

app.provider('calcService', function(){

	var baseUrl = '';

	this.config = function(url){
		baseUrl = url;
	};

	this.$get = ['$log', '$http', function($log, $http){
		$log.log("instantiating calcService...")
		var oCalcService = {};

		//oCalcService.getSum = function(a,b){
		//	return parseInt(a) + parseInt(b);
		//};

		//oCalcService.getSum = function(a, b, cb){
		//	var s = parseInt(a) + parseInt(b);
		//	cb(s);	
		//};

		oCalcService.getSum = function(a, b, cb){

			$http({
				url: baseUrl + '/Sum?a=' + a + '&b=' + b,
				method: 'GET'
			}).then(function(resp){
				$log.log(resp.data);
				cb(resp.data);
			},function(resp){
				$log.error("ERROR occurred");
			});
		};		

		return oCalcService;
	}];

});

app.config(['calcServiceProvider', function(calcServiceProvider){
	calcServiceProvider.config("http://localhost:4467");
}]);

অবশেষে ইউআই যা উপরের যে কোনও পরিষেবার সাথে কাজ করে:

<html>
<head>
	<title></title>
	<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js" ></script>
	<script type="text/javascript" src="t03.js"></script>
</head>
<body ng-app="app">
	<div ng-controller="emp">
		<div>
			Value of a is {{a}},
			but you can change
			<input type=text ng-model="a" /> <br>

			Value of b is {{b}},
			but you can change
			<input type=text ng-model="b" /> <br>

		</div>
		Sum = {{sum}}<br>
		<button ng-click="doSum()">Calculate</button>
	</div>
</body>
</html>


10

অ্যাংুলারজেএস উত্স থেকে কেবল জিনিসগুলি স্পষ্ট করার জন্য, আপনি একটি পরিষেবা দেখতে পাচ্ছেন কেবলমাত্র ফ্যাক্টরি ফাংশনটিকে কল করে যা পরিদর্শনকারীকে ফাংশন বলে:

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

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

9

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

সেবা :

বাক্য গঠন:

app.js

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

 ServiceExampleController.$inject = ['NameOfTheService'] //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. সিঙ্গলটন : একাধিক মডিউলগুলিতে ইনজেকশন করা থাকলে, সমস্তেরই কেবল একটি নির্দিষ্ট উদাহরণে অ্যাক্সেস থাকবে। এজন্য বিভিন্ন নিয়ামক জুড়ে ডেটা ভাগ করে নেওয়া খুব সুবিধাজনক।

কারখানা

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

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()পদ্ধতিটি সাধারণত এমন কোনও কিছুর জন্য শর্টকাট হিসাবে ব্যবহৃত হয় যা কোনও কনফিগারেশনের প্রয়োজন হয় না।

প্রদানকারী

প্রথমে সিনট্যাক্সটি আবার দেখুন:

angular.module('ProviderModule', [])
.controller('ProviderModuleController', ProviderModuleController)
.provider('ServiceProvider', ServiceProvider)
.config(Config); //optional

Config.$inject = ['ServiceProvider'];
function Config(ServiceProvider) {
  ServiceProvider.defaults.maxItems = 10; //some default value
}


ProviderModuleController.$inject = ['ServiceProvider'];
function ProviderModuleController(ServiceProvider) {
  //some methods
}

function ServiceProvider() {
  var provider = this;

  provider.defaults = {
    maxItems: 10
  };

  provider.$get = function () {
    var someList = new someListService(provider.defaults.maxItems);

    return someList;
  };
}

}

সরবরাহকারীর বৈশিষ্ট্য:

  1. কৌণিকসেবা তৈরির সর্বাধিক নমনীয় পদ্ধতি হ'ল সরবরাহকারী।
  2. কেবলমাত্র আমরা এমন একটি কারখানা তৈরি করতে পারি যা গতিশীলভাবে কনফিগারযোগ্য নয়, সরবরাহকারী পদ্ধতি সহ কারখানাটি ব্যবহার করার সময় আমরা আমাদের সম্পূর্ণ অ্যাপ্লিকেশনটির বুটস্ট্র্যাপিংয়ের সময় কারখানাটি কাস্টমাইজ করতে পারি।
  3. কারখানাটি কাস্টম সেটিংস সহ অ্যাপ্লিকেশন জুড়ে ব্যবহার করা যেতে পারে। অন্য কথায়, অ্যাপ্লিকেশন শুরু হওয়ার আগে আমরা এই কারখানাটি কনফিগার করতে পারি। বাস্তবে কৌণিক ডকুমেন্টেশনে এটি উল্লেখ করা হয় যে সরবরাহকারী পদ্ধতি হ'ল বাস্তবে পর্দার আড়ালে কার্যকর করা হয় যখন আমরা কোনও .serviceবা .factoryপদ্ধতিতে আমাদের পরিষেবাগুলি কনফিগার করি ।
  4. এটি $getএমন একটি ফাংশন যা সরবরাহকারীর উদাহরণের সাথে সরাসরি সংযুক্ত থাকে। এই ফাংশনটি একটি ফ্যাক্টরি ফাংশন। অন্য কথায়, এটি কেবল সেই পদ্ধতিটির মতো যা আমরা পদ্ধতিতে সরবরাহ করতে ব্যবহার করি .factory। এই ফাংশনে, আমরা আমাদের নিজস্ব পরিষেবা তৈরি করি। এই $getসম্পত্তি, এটি একটি ফাংশন, যা সরবরাহকারীকে সরবরাহকারী করে তোলেঅ্যাঙ্গুলারজেএস সরবরাহকারীর কাছ থেকে এমন একটি সম্পত্তি পাওয়ার প্রত্যাশা করে যার মূল্য একটি ফাংশন যা কৌণিকর একটি কারখানার ফাংশন হিসাবে বিবেচনা করবে। তবে এই পুরো সরবরাহকারীটিকে কী সেটাকে খুব বিশেষ করে তুলেছে তা হ'ল এটি হ'ল যে আমরা configপরিষেবা সরবরাহকারীর অভ্যন্তরে কিছু অবজেক্ট সরবরাহ করতে পারি এবং এটি সাধারণত পূর্বনির্ধারিত আসে যা আমরা পরে ধাপে ওভাররাইট করতে পারি, যেখানে আমরা পুরো অ্যাপ্লিকেশনটি কনফিগার করতে পারি।

7

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


7

মূলত, সরবরাহকারী, কারখানা এবং পরিষেবা সমস্ত পরিষেবা। কারখানা কোনও পরিষেবার একটি বিশেষ ক্ষেত্রে যখন আপনার প্রয়োজন সমস্ত একটি a get () ফাংশন হয়, আপনাকে কম কোড দিয়ে এটি লেখার অনুমতি দেয়।

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

এখানে প্রতিটি ব্যবহার করার একটি সংক্ষিপ্তসার এখানে দেওয়া হয়েছে:

কারখানা : আপনি যে মান সরবরাহ করছেন তা অন্য ডেটার ভিত্তিতে গণনা করা দরকার।

পরিষেবা : আপনি পদ্ধতি সহ কোনও বস্তু ফিরিয়ে দিচ্ছেন।

সরবরাহকারী : আপনি কনফিগার করতে সক্ষম হতে চান, কনফিগার পর্বের সময়, অবজেক্টটি তৈরি হওয়ার আগে তৈরি হতে চলেছে। অ্যাপ্লিকেশন সম্পূর্ণরূপে শুরু হওয়ার আগে বেশিরভাগ অ্যাপ্লিকেশন কনফিগারেশনে সরবরাহকারীটি ব্যবহার করুন।


ERM। মান, কারখানা, পরিষেবা এবং ধ্রুবক - সরবরাহকারীর রেসিপিটির উপরে কেবল সিনট্যাকটিক চিনি। Angularjs ডক্স - প্রদানকারীর
Sudarshan_SMD

হ্যাঁ আমি সম্মতি
জানাই

4

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

2. কোনও পরিষেবা তৈরির সহজতম উপায় হ'ল কারখানা () পদ্ধতিটি ব্যবহার করে। ফ্যাক্টরি () পদ্ধতিটি পরিষেবার ফাংশন এবং পরিষেবাদি ডেটা সম্বলিত কোনও বস্তুকে ফেরত দিয়ে একটি পরিষেবা সংজ্ঞা দিতে দেয় allows পরিষেবা সংজ্ঞা ফাংশনটি যেখানে আমরা আমাদের ইনজেকশনযোগ্য পরিষেবাদি যেমন $ HTTP এবং $ q রাখি। উদা:

angular.module('myApp.services')
.factory('User', function($http) { // injectables go here
var backendUrl = "http://localhost:3000"; var service = {
    // our factory definition
user: {},
setName: function(newName) {
      service.user['name'] = newName;
    },
setEmail: function(newEmail) { service.user['email'] = newEmail;
},
save: function() {
return $http.post(backendUrl + '/users', { user: service.user
}); }
};
return service; });

আমাদের অ্যাপ্লিকেশনটিতে কারখানা () ব্যবহার করা

আমাদের অ্যাপ্লিকেশনটিতে কারখানাটি ব্যবহার করা সহজ কারণ আমরা রান-টাইমে যেখানে এটি প্রয়োজন সেখানে কেবল ইনজেক্ট করতে পারি।

angular.module('myApp')
.controller('MainController', function($scope, User) {
  $scope.saveUser = User.save;
});
  1. অন্যদিকে পরিষেবা () পদ্ধতিটি একটি কনস্ট্রাক্টর ফাংশন সংজ্ঞায়িত করে একটি পরিষেবা তৈরি করার অনুমতি দেয়। আমরা কোনও কাঁচা জাভাস্ক্রিপ্ট অবজেক্টের পরিবর্তে আমাদের পরিষেবাটি সংজ্ঞায়িত করতে প্রোটোটাইপিকাল অবজেক্টটি ব্যবহার করতে পারি। কারখানা () পদ্ধতির মতো, আমরা ফাংশন সংজ্ঞাতে ইনজেকটেবলগুলিও সেট করব।
  2. পরিষেবা তৈরির সর্বনিম্ন স্তরের উপায়টি () পদ্ধতিটি ব্যবহার করে। এটি একটি পরিষেবা তৈরির একমাত্র উপায় যা আমরা .config () ফাংশনটি ব্যবহার করে কনফিগার করতে পারি। পদ্ধতির পূর্বের থেকে পৃথক, আমরা একটি সংজ্ঞায়িত ইনজেকটেবলগুলি সেট করব $ (() ফাংশন সংজ্ঞা পাবেন।

-3

সিনট্যাকটিক চিনির পার্থক্য । কেবল সরবরাহকারীর প্রয়োজন। বা অন্য কথায় কেবল সরবরাহকারীই আসল কৌণিক, অন্য সমস্তগুলি প্রাপ্ত হয় (কোড হ্রাস করতে)। মান () নামে একটি সাধারণ সংস্করণও রয়েছে যা কেবলমাত্র মান দেয়, কোনও গণনা বা ফাংশন হয় না। এমনকি মান প্রদানকারী থেকে প্রাপ্ত!

তাহলে কেন এই ধরনের জটিলতা, আমরা কেন কেবল সরবরাহকারী ব্যবহার করতে পারি না এবং সমস্ত কিছু ভুলে যেতে পারি না? আমাদের সহজে কোড লিখতে এবং আরও ভাল যোগাযোগ করতে সহায়তা করার কথা রয়েছে। এবং সংলগ্ন ইন গাল জবাব হবে, এটি আরও জটিলতর কাঠামোগত বিক্রয় আরও ভাল হয়।


  • এমন একটি প্রদানকারী যা মান = মান প্রদান করতে পারে
  • এমন একটি সরবরাহকারী যা কেবল ইনস্ট্যান্টেট করতে এবং = কারখানায় (+ মান) ফেরত দিতে পারে
  • এমন সরবরাহকারী যা কিছু করতে পারে = পরিষেবা = + (কারখানার, + মান) করতে পারে
  • সরবরাহকারী = অবশ্যই $ get (+ কারখানা, + পরিষেবা, + মান) নামক একটি সম্পত্তি থাকতে হবে

কৌণিক ইনজেকশন আমাদের এই সিদ্ধান্তে পৌঁছানোর প্রথম ইঙ্গিত দেয়।

" not ইনজেক্টর সরবরাহকারীর দ্বারা নির্ধারিত হিসাবে অবজেক্টের দৃষ্টান্তগুলি পুনরুদ্ধার করতে ব্যবহৃত হয় " পরিষেবা নয়, কারখানা নয় তবে সরবরাহকারী।

এবং আরও ভাল উত্তরটি হ'ল: "একটি কৌণিক পরিষেবা একটি পরিষেবা কারখানার দ্বারা তৈরি করা হয় These $ get, যা পরিষেবা কারখানার কার্যকারিতা ধারণ করে called

সুতরাং মাস্টার প্রদানকারী এবং ইনজেক্টর এবং সমস্ত স্থানে পড়ে যাবে :)। এবং এটি টাইপসক্রিপ্টে আকর্ষণীয় হয়ে ওঠে যখন IS গেটটি আইভ্যাসিওয়ারপ্রায়াইডারের কাছ থেকে উত্তরাধিকার সূত্রে কোনও সরবরাহকারীর মধ্যে প্রয়োগ করা যেতে পারে।

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