নির্ভরতা ইঞ্জেকশনের শৈলীর মধ্যে ব্যবহারিক পার্থক্য কী?


12

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

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

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


পথে আপনি আর কী খুঁজে পেয়েছেন বা পড়েছেন তা নিশ্চিত নন। আমি এখানে এবং এখানে কিছু অনুরূপ থ্রেড পেয়েছি । আমি নিজেই নতুন, এবং আপনি যে উত্তরগুলি পেতে পারেন সে সম্পর্কে কৌতূহলী হব :)

@ ব্যবহারকারী 1766760 আপনার এখানে আমাকে সাহায্য করা উচিত, আমার প্রশ্নটি বন্ধ হওয়ার পক্ষে ভোট দেওয়া হচ্ছে, আরও দুটি ভোট এবং এটি সম্পন্ন হয়েছে !!! প্রশ্নটি আপ করুন বা কিছু দিন, আমি জানি না বন্ধ হওয়া এড়াতে কী করা যেতে পারে।
ইক্যাম্পভার

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

আপনি প্রশ্নটি কিছুটা প্রসারিত করতে পছন্দ করতে পারেন। নির্ভরতা ইনজেকশন "নিয়ন্ত্রণের বিপরীতমুখীকরণ" এর একটি ফর্ম। বিকল্প আছে। আপত্তিজনক বিকল্পের জন্য দরকারী তবে পাকা উদাহরণস্বরূপ পরিষেবা অবস্থান।
ইয়ান

উত্তর:


12

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

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

ইন্টারফেস ইনজেকশন , যতদূর আমি বলতে পারি, সেটার ইঞ্জেকশনের চেয়ে খুব বেশি আলাদা নয়। উভয় ক্ষেত্রেই আপনি (বিকল্পভাবে) একটি নির্ভরতা নির্ধারণ করছেন যা পরে পরিবর্তন করা যেতে পারে।

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

প্রায়শই, দুটি পৃথক বাস্তবায়নে পাস করার জন্য আমার একমাত্র কারণটি হচ্ছে পরীক্ষা করা। উত্পাদন, আমি একটি পাস করতে পারেন DataRepository, কিন্তু পরীক্ষায়, আমি একটি পাস করতে হবে FakeDataRepository। এই ক্ষেত্রে আমি সাধারণত দুটি কনস্ট্রাক্টর সরবরাহ করব: একটির কোনও প্যারামিটার নেই এবং অন্যটি যা গ্রহণ করে IDataRepository। তারপরে, কোনও প্যারামিটার ছাড়াই কনস্ট্রাক্টরে, আমি দ্বিতীয় কন্সট্রাক্টরের কাছে একটি চেইন করব এবং একটিতে পাস করব new DataRepository()

এখানে সি # তে একটি উদাহরণ রয়েছে:


public class Foo
{
  private readonly IDataRepository dataRepository;

  public Foo() : this(new DataRepository())
  {
  }

  public Foo(IDataRespository dataRepository)
  {
    this.dataRepository = dataRepository;
  }
}

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

var foo = new Foo(new DataRepository());
যাইহোক, আমি এখনও পরীক্ষার জন্য বিকল্প বাস্তবায়নে পাস করতে পারি। আমি বুঝতে পারি যে দরিদ্র মানুষের ডিআই দিয়ে আমি আমার নির্ভরতা হার্ডকোড করছি, তবে এটি আমার পক্ষে গ্রহণযোগ্য যেহেতু আমি বেশিরভাগই ডিআই-কে পরীক্ষার জন্য ব্যবহার করি।


ধন্যবাদ, এটি যা আমি বুঝতে পেরেছি তার কাছাকাছি, তবে এখনও, এমন কোনও দৃশ্য আছে যেখানে আপনি কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করতে পারবেন না ?
ইক্যাম্পভার

1
আপনি সম্ভবত alচ্ছিক নির্ভরতার জন্য কনস্ট্রাক্টর ইঞ্জেকশন ব্যবহার করতে চাইবেন না। এটি ব্যবহার না করার জন্য আমি অন্য কোনও কারণ নিয়ে ভাবতে পারি না।
jgetlett

আমি বিশেষত কিছু কনফিগারেশন ক্লাস তৈরি করতে বিশেষত সম্পত্তি সেটার ইঞ্জেকশন ব্যবহার করি যার মধ্যে প্রচুর পরিমাণে মান রয়েছে। আমি এটি অন্য কোথাও ব্যবহার করি না। Alwaysচ্ছিক পরামিতিগুলির জন্য কেস তৈরি করতে আমি সর্বদা কিছুটা সন্দেহজনক কারণ এর একক সুযোগের নিয়মের একটি লঙ্ঘনের একটি ভাল সম্ভাবনা রয়েছে। অবশ্যই নিয়মগুলি ভাঙ্গা বোঝানো হয়েছে, সুতরাং ...
ইয়ান

@ জেওলেট - এটি দুর্দান্ত, আমি ইউনিট পরীক্ষার জন্য একটি সহজ সহজ স্ট্যাবিং কৌশলটি খুঁজছিলাম যা আমার সমাধানকে জটিল করে
তুলবে

2

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

ইন্টারফেস ইনজেকশনটি ইঞ্জেকশনের আরও উন্নত রূপ যা দরকারী এটি কার্যকর কারণ এটি অবজেক্টের আরম্ভের সময় এটি ব্যবহার করবে না বরং এটি ব্যবহার করা মুহুর্তে নির্ভরতা নির্ধারণ করার অনুমতি দেয় যা এটি ব্যবহার করবে। এটি বেশ কয়েকটি দরকারী বিকল্পের অনুমতি দেয়:

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

  • এটি অলস প্রারম্ভিককরণের অনুমতি দেয় - এটি নির্ভরতা ব্যবহার করা শেষ না হওয়া পর্যন্ত আরম্ভ করার প্রয়োজন নেই

  • এটি নির্ভরশীলতাগুলি যখন বিদ্যমান না থাকে তখন পুনরায় সংস্থাগুলি থাকা অবস্থায় ক্যাশেড অনুলিপি থেকে লোড হওয়ার অনুমতি দেয় (যেমন SoftReferenceজাভাতে কোনও ব্যবহার করে )।

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

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