কৌণিক 6 এ পরিষেবাগুলি তৈরি করার সময় ইনজেকশনযোগ্য ডিকোয়টারের সাথে সরবরাহের উদ্দেশ্য কী?


136

কৌণিক সিএলআইতে পরিষেবাগুলি তৈরি করার সময়, এটি ইনজেকটেবল ডেকোররেটারের জন্য 'রুট' এর একটি ডিফল্ট বৈশিষ্ট্যযুক্ত 'প্রদত্ত' সম্পত্তি সহ অতিরিক্ত মেটাডেটা যুক্ত করছে is

@Injectable({
  providedIn: 'root',
})

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

হালনাগাদ:

অন্য কারও জন্য, নিম্নলিখিত অনুচ্ছেদে এটির আরও একটি ভাল ব্যাখ্যা সরবরাহ করেছে, বিশেষত যদি আপনি কেবল একটি বৈশিষ্ট্য মডিউলে আপনার পরিষেবা সরবরাহ করতে চান।

@Injectable()নতুন providedIn অ্যাট্রিবিউটটি ব্যবহার করে সরাসরি নতুন ডিজিটরের অভ্যন্তরে কোনও সরবরাহকারীকে রেজিস্টার করার একটি নতুন, প্রস্তাবিত, উপায় রয়েছে way এটি 'root'আপনার অ্যাপ্লিকেশনটির কোনও মান বা কোনও মডিউল হিসাবে গ্রহণ করে। যখন আপনি ব্যবহার 'root', আপনার injectableঅ্যাপ্লিকেশনে একটি Singleton হিসাবে নিবন্ধিত করা হবে, এবং আপনি যদি root পরিচয় মডিউল প্রদানকারীর এটি যোগ করতে প্রয়োজন হবে না। একইভাবে, আপনি যদি ব্যবহার providedIn: UsersModuleকরেন injectableতবে UsersModuleএটি providersমডিউলের সাথে যোগ না করেই সরবরাহকারী হিসাবে নিবন্ধভুক্ত "" - https://blog.ninja-squad.com/2018/05/04/ কি- is -new- angular -6 /

আপডেট 2:

আরও তদন্তের পরে, আমি সিদ্ধান্ত নিয়েছি এটি থাকা কেবল কার্যকর providedIn: 'root'

আপনি যদি provideরুট মডিউল ব্যতীত অন্য কোনও মডিউলে কোনও পরিষেবা চান , তবে আপনি providersবৈশিষ্ট্য মডিউলটির সজ্জকারগুলিতে অ্যারে ব্যবহার করা ভাল otherwise এখানে আকর্ষণীয় আলোচনা হওয়া দরকার - https://github.com/angular/angular-cli/issues/10170


17
আমি মনে করি আপনার আপডেটগুলি আপনার প্রশ্নের সাথে যুক্ত হওয়ার পরিবর্তে একটি উত্তর হওয়া উচিত (আপনি নিজের প্রশ্নগুলির উত্তর দিতে পারেন)।
ফোনিক্স

সর্বাধিক গুরুত্বপূর্ণ অংশটি হচ্ছে সিঙ্গলটন, কেউই এর উল্লেখ করে না!
কাইল বারকেট

উত্তর:


54

আপনি যদি প্রদত্ত ইন ব্যবহার করেন তবে ইনজেকটেবলটি মডিউল সরবরাহকারীদের সাথে যোগ না করে মডিউল সরবরাহকারী হিসাবে নিবন্ধিত হয়।

থেকে Docs

পরিষেবাটি নিজেই একটি শ্রেণি যা সিএলআই তৈরি করেছে এবং এটি @ ইনজেক্টেবল দ্বারা সজ্জিত। ডিফল্টরূপে, এই সজ্জা প্রদানকারী একটি সরবরাহকৃত সম্পত্তি দিয়ে কনফিগার করা হয়, যা পরিষেবার জন্য সরবরাহকারী তৈরি করে। এই ক্ষেত্রে, সরবরাহিত ইন: 'রুট' নির্দিষ্ট করে যে পরিষেবাটি রুট ইনজেক্টারে সরবরাহ করা উচিত।


4
ধন্যবাদ সজীবথরন। ঠিক আছে, সুতরাং মনে হচ্ছে এটি পরিষেবাটি কোথায় সরবরাহ করা উচিত তা নির্দিষ্ট করার একটি নতুন শর্টকাট উপায়। আমি আমার প্রাথমিক অগ্রাধিকার হবে বরং ProvidedIn ট্যাগ বিক্ষিপ্ত কোড বেস পড়ার চেয়ে সব যে পরিষেবাগুলি প্রদানকারীর হিসেবে ঘোষণা করা হয়, দেখার জন্য একটি মডিউল এর প্রদানকারীর তালিকা এ খুঁজছেন হয়েছে .... (?)
স্টিফান Zvonar

2
এঙ্গুলার এটি যুক্ত করার কোনও কারণ ছিল? এটির কোন সমস্যা আছে? আমি এর কোনও কারণ দেখছি না।
prolink007

3
অ্যাপমোডুল / কোর মড্যুলের সংজ্ঞাটি আরও ছোট রাখে;)
স্টিফান জভোনার

22
@ prolink007। সরবরাহকৃত ব্যবহার ব্যবহার করে অ্যাপ্লিকেশন দ্বারা পরিষেবাগুলিকে অলস-লোড হতে দেয়। এটি পরীক্ষা করতে, আপনার পরিষেবাগুলিতে কনসোল লগগুলি রাখুন। আমার হোম পৃষ্ঠাতে 16 টি পরিষেবা লোড করা হত, এখন এটি 9 টি লোড হয় the পারফরম্যান্সটির পরিমাণ নির্ধারণ করা শক্ত but
স্টিভেথাম্যাকগুই

3
সজ্জা ব্যবহারকারীর ব্যবহারের providedInসময় পরিষেবাটি কোথায় শুরু করা উচিত তা নির্ধারণ করার জন্য অ্যাট্রিবিউটটি ব্যবহার করে আপনি আপনার পরিষেবাগুলিকে গাছকে কাঁপানোর যোগ্য করে তুলতে পারেন @Injectable()। তারপরে আপনার এটিকে আপনার NgModuleঘোষণার সরবরাহকারী বৈশিষ্ট্য এবং এর আমদানি বিবৃতি থেকে অপসারণ করা উচিত his এটি বান্ডেল থেকে অব্যবহৃত কোড সরিয়ে বান্ডেলের আকার হ্রাস করতে সহায়তা করতে পারে।
nircraft

48

providedIn: 'root' কৌণিক 6 এর পরে পরিষেবা সরবরাহের সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উপায়:

  1. পরিষেবাটি মডিউলের সরবরাহকারী অ্যারেতে (অ্যাংুলার <= 5 এর মতো) যুক্ত করার প্রয়োজন নেই এমন একটি সিঙ্গলটন হিসাবে প্রশস্ত অ্যাপ্লিকেশন উপলব্ধ হবে।
  2. যদি পরিষেবাটি কেবল অলস লোডযুক্ত মডিউলটির মধ্যে ব্যবহৃত হয় তবে এটি মডিউলটি দিয়ে অলস হবে
  3. যদি এটি কখনও ব্যবহার না করা হয় তবে এটি বিল্ড (গাছের কাঁপানো) এর মধ্যে থাকবে না।

আরও তথ্যের জন্য ডকুমেন্টেশন এবং এনজিএমডিউল এফএকিউগুলি বিবেচনা করুন

BTW:

  1. আপনি যদি অ্যাপ্লিকেশন-ব্যাপী সিঙ্গলটন না চান তবে পরিবর্তে কোনও উপাদান সরবরাহকারীর অ্যারে ব্যবহার করুন।
  2. আপনি যদি সুযোগটি সীমাবদ্ধ করতে চান তবে অন্য কোনও বিকাশকারী কোনও নির্দিষ্ট মডিউলের বাইরে আপনার পরিষেবাটি আর ব্যবহার না করে, providersপরিবর্তে এনজিএমডুলির অ্যারে ব্যবহার করুন ।

37

ডক্স থেকে

ইনজেকটেবল সাজসজ্জা কী?

সৃষ্টির জন্য ইনজেক্টর হিসাবে উপলব্ধ একটি শ্রেণিকে চিহ্নিত করে।

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class UserService {
}

পরিষেবাটি নিজেই একটি শ্রেণি যা সিএলআই তৈরি করেছে এবং এটি @ ইনজেক্টেবল () দ্বারা সজ্জিত।

সরবরাহ করা ঠিক কি করে?

কোন এনজেক্টর ইনজেক্টেবল সরবরাহ করবে তা নির্ধারণ করে, হয় এটি কোনও @ এনজিএমডিউল বা অন্য ইনজেক্টর টাইপের সাথে যুক্ত করে বা এই ইনজেকটেবলটি 'রুট' ইনজেক্টারে সরবরাহ করা উচিত, যা বেশিরভাগ অ্যাপ্লিকেশনগুলিতে অ্যাপ্লিকেশন-স্তরের ইনজেক্টর হবে।

providedIn: Type<any> | 'root' | null

সরবরাহিত ইন: 'রুট'

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

প্রদত্ত ইন: মডিউল

এটি নির্দিষ্ট করে বলাও সম্ভব যে কোনও নির্দিষ্ট @ এনজিএমডিউলে কোনও পরিষেবা সরবরাহ করা উচিত। উদাহরণস্বরূপ, আপনি যদি অ্যাপ্লিকেশনগুলিতে আপনার তৈরি মডিউলটি আমদানি না করে কোনও পরিষেবা উপলব্ধ না চান তবে আপনি পরিষেবাটি মডিউলে সরবরাহ করতে হবে তা নির্দিষ্ট করতে পারেন

import { Injectable } from '@angular/core';
import { UserModule } from './user.module';

@Injectable({
  providedIn: UserModule,
})
export class UserService {
}

এই পদ্ধতিটিকে অগ্রাধিকার দেওয়া হয়েছে কারণ এটি গাছ-কাঁপানো সক্ষম করে ( গাছের কাঁপানো একটি বিল্ড প্রক্রিয়াতে একটি পদক্ষেপ যা কোনও কোড বেস থেকে অব্যবহৃত কোডকে সরিয়ে দেয় ) সেবার যদি কিছুই উদ্বুদ্ধ করুন।

কোন মডিউলটি এটি সরবরাহ করতে হবে সেসে যদি সেটি নির্দিষ্ট করা সম্ভব না হয় তবে আপনি মডিউলটির মধ্যে পরিষেবাটির জন্য কোনও সরবরাহকারীও ঘোষণা করতে পারেন:

import { NgModule } from '@angular/core';
import { UserService } from './user.service';

@NgModule({
  providers: [UserService],
})
export class UserModule {
}

4
সেরা ব্যাখ্যা।

2
এই উত্তরটি কৌণিক ডক-এর সংজ্ঞার চেয়ে আরও ভাল। খুব পরিস্কার.
শমিরা অনুরাঙ্গ

2
খুব ভালভাবে ব্যাখ্যা করা হয়েছে, অনেক ধন্যবাদ!
জাকি মোহাম্মদ

এটি খালি যখন সম্পর্কে কি @Injectable()?
বেন টালিডিয়োরোস

13

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

পরিষেবা ক্লাসগুলি তাদের নিজস্ব সরবরাহকারী হিসাবে কাজ করতে পারে যার কারণে @ ইনজেক্টেবল ডেকরেটারে এগুলি সংজ্ঞায়িত করা আপনার প্রয়োজনীয় রেজিস্ট্রেশন।


4

অনুসারে Documentation:

@ ইনজেক্টেবল () মেটাডেটাতে সরবরাহকারীর নিবন্ধন করায় অ্যাংুলার কোনও অ্যাপ্লিকেশনটি সংযোগযুক্ত অ্যাপ্লিকেশনটি ব্যবহার না করা হলে সেটিকে অপসারণ করে অনুকূলিত করতে দেয়।

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