নির্ভরতা ইনজেকশন জন্য সেরা সংজ্ঞা কি?


10

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

বিকাশকারীদের জন্য ডিআই বর্ণনা করার সর্বোত্তম উপায় ব্যাখ্যা করতে যে কেউ আমাকে সহায়তা করতে পারে?


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

সুতরাং, আমি যেমন বুঝতে পারি, এটি কেবল আমার সমস্যা নয়।
টিয়াগো



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

উত্তর:


22

নির্ভরতা ইনজেকশন একটি সোজাসাপ্টা ধারণার জন্য একটি ভয়াবহ নাম (আইএমও) 1 । এখানে একটি উদাহরণ:

  1. আপনার কাছে এমন একটি পদ্ধতি রয়েছে (বা পদ্ধতি সহ ক্লাস) যা এক্স করে (যেমন ডাটাবেস থেকে ডেটা পুনরুদ্ধার)
  2. এক্স করার অংশ হিসাবে, বলেছেন পদ্ধতিটি একটি অভ্যন্তরীণ সংস্থান তৈরি করে এবং পরিচালনা করে (উদাঃ ক DbContext)। এই অভ্যন্তরীণ সংস্থানটিকে নির্ভরতা বলা হয়
  3. আপনি DbContextপদ্ধতিটি থেকে উত্স তৈরি এবং পরিচালনা মুছে ফেলুন এবং এই সংস্থানটি সরবরাহ করার জন্য কলারের দায়বদ্ধ হন (একটি পদ্ধতি প্যারামিটার হিসাবে বা শ্রেণীর তাত্ক্ষণিক ভিত্তিতে)
  4. আপনি এখন নির্ভরতা ইনজেকশন করছেন।


[1] : আমি নিম্ন-স্তরের পটভূমি থেকে এসেছি এবং বসে থাকতে এবং নির্ভরতা ইনজেকশন শিখতে আমার কয়েক মাস লেগেছে কারণ নামটি বোঝায় যে এটি আরও জটিল কিছু হবে, যেমন ডিএলএল ইনজেকশন । সত্য যে ভিসুয়াল স্টুডিও (সাধারণ এবং আমরা ডেভেলপারদের) .NET লাইব্রেরি (ডিএলএল বা বোঝায় সমাহারগুলি ) একটি প্রকল্প উপর যেমন নির্ভর করে যে নির্ভরতা এ সব সাহায্য করে না। নির্ভরতা ওয়াকার (depend.exe) এর মতো একটি জিনিস রয়েছে ।


[সম্পাদনা] আমি অনুভব করেছি যে কিছু ডেমো কোড কারওর জন্য কার্যকর হবে, সুতরাং এখানে একটি (সি #)।

নির্ভরতা ইনজেকশন ছাড়াই:

public class Repository : IDisposable
{
    protected DbContext Context { get; }

    public Repository()
    {
        Context = new DbContext("name=MyEntities");
    }

    public void Dispose()
    {
        Context.Dispose();
    }
}

আপনার গ্রাহকরা এর পরে এমন কিছু করবেন:

using ( var repository = new Repository() )
{
    // work
}

নির্ভরতা ইঞ্জেকশন প্যাটার্ন সহ একই শ্রেণি প্রয়োগ করা হবে:

public class RepositoryWithDI
{
    protected DbContext Context { get; }

    public RepositoryWithDI(DbContext context)
    {
        Context = context;
    }
}

এটিকে এখন আপনার ক্লাসে এটিকে DbContextপাস এবং পাস (অরার্ম, ইনজেকশন ) দেওয়ার জন্য কলারের দায়বদ্ধতা :

using ( var context = new DbContext("name=MyEntities") )
{
    var repository = new RepositoryWithDI(context);

    // work
}

3
এটি উইকিপিডিয়ায় যুক্ত করা উচিত।
ইভোরর

2
এখন কোনও ডিবি কনটেক্সট ইনস্ট্যান্ট করার জন্য কলারের দায়বদ্ধতা - আমি মনে করি এটি সমস্ত প্রয়োজনীয় নির্ভরতা তাত্ক্ষণিকভাবে প্রয়োগের আবেদনের এন্ট্রি পয়েন্টের দায়িত্ব হবে be সুতরাং ভোক্তার কেবল নিজস্ব চুক্তিতে নির্ভরতা হিসাবে প্রয়োজনীয় ধরণের প্রবর্তন করা প্রয়োজন।
ফ্যাবিও

@ ফ্যাবিও এটি হতে পারে। (সেক্ষেত্রে কলারের দায়িত্ব সেই রিসোর্সটি সরবরাহ করা হবে যা অ্যাপ্লিকেশন প্রারম্ভের সময় যে পদ্ধতিটি / শ্রেণি বলা হচ্ছে তা সরবরাহ করা হয়েছিল।) আমার উদাহরণস্বরূপ, যদিও এটি নির্ভরতা ইনজেকশন ধারণাটি ব্যাখ্যা করার প্রয়োজন হয় না ।
২৩7777

5

বাস্তব বিশ্বের উপমা ব্যবহার করে বিমূর্ত ধারণাগুলি প্রায়শই আরও ভালভাবে ব্যাখ্যা করা হয়। এটি আমার গোপনে উপমা:

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

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

সুতরাং আপনি একটি নতুন নিয়ম প্রতিষ্ঠা করেছেন: গ্রাহকরা তাদের নিজস্ব রুটি নিয়ে আসে। আপনি নিজে আর কোনও রুটি সরবরাহ করেন না। এটি একটি উইন-উইন পরিস্থিতি: গ্রাহকরা ঠিক যে রুটি চান তা পাবেন এবং আপনার আর যত্ন নেওয়ার মতো রুটি সংগ্রহ করার দরকার নেই। সর্বোপরি, আপনি একজন স্যান্ডউইচ প্রস্তুতকারক, কোনও বেকার নয়।

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

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


1
আমি এটি পছন্দ করি তবে ওপি বিকাশকারীদের জন্য ব্যাখ্যা খুঁজছে । একটি প্রাথমিক বিমূর্ততা ভাল, তবে খুব শীঘ্রই বা পরে এটির একটি বাস্তব জীবনের উদাহরণ প্রয়োজন।
রবি ডি

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

2
আপনি অবশ্যই ঠিক আছেন, তবে আমি সাহায্য করতে পারি না তবে মনে হয় আমার একটি স্পষ্ট উদাহরণ দরকার - যেমন আমার ক্ষুধা জাগানোর জন্য কোনও আসল ফাইল সিস্টেম বা ডাটাবেস না থাকা তবে সম্ভবত এটি আমার সংকীর্ণ বিকাশকারী দৃষ্টিভঙ্গি :)
রবি Dee

1

এর সহজ উত্তর:

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

নেট কোরটি আপনি দিতে পারেন এমন একটি দুর্দান্ত উদাহরণ যা এই কাঠামোটিতে প্রচুর নির্ভরতা ইনজেকশন ব্যবহার করা হয়। সাধারণত, আপনি যে পরিষেবাগুলি ইনজেক্ট করতে চান সেগুলি startup.csফাইলটিতে অবস্থিত ।

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


0

মূলত, একটি সাধারণ ধারণাটি যা রয়েছে তার চারপাশে প্রচুর ফ্লফ এবং বঙ্কম রয়েছে।

আপনি যখন কোডটি খুব সহজভাবে করতে পারেন তখন " আমার কী কাঠামো ব্যবহার করা উচিত " তা নিয়ে জড়িয়ে পড়া খুব সহজ ।

এটি আমি ব্যক্তিগতভাবে ব্যবহার করি সংজ্ঞা:

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

ওয়াই একটি ফাইল সিস্টেম বা ডাটাবেস সংযোগ যেখানে কিছু উদাহরণ হতে পারে।

যেমন ফ্রেমওয়ার্ক MOQ ডাবলস (Y এর প্রিটেন্ড সংস্করণ) একটি ব্যবহার নির্ধারণ করা করার অনুমতি ইন্টারফেস তাই এটি ওয়াই, যেখানে ওয়াই উদাহরণস্বরূপ, একটি ডাটাবেসের সংযোগ একটি দৃষ্টান্ত মধ্যে উদ্বুদ্ধ করা সম্ভব।

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


0

প্যারামিটারের মাধ্যমে সেই আচরণটি .োকানোর পদ্ধতিটির মাধ্যমে আমরা রানটাইমে একটি ফাংশনের আচরণ সরবরাহ করি।

কৌশল প্যাটার্ন নির্ভরতা ইনজেকশনের একটি দুর্দান্ত উদাহরণ।


0

এটি সঠিকভাবে করার জন্য, আমাদের প্রথমে নির্ভরতা এবং ইনজেকশন সংজ্ঞায়িত করতে হবে।

  • নির্ভরতা: কোনও সংস্থার একটি অপারেশন প্রয়োজন।
  • ইনজেকশন: সাধারণত কোনও পদ্ধতির আর্গুমেন্ট হিসাবে অপারেশনটিতে সেই সংস্থানটি পাস করা।

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

মনে করুন পরিবর্তে আপনি সম্পত্তি ব্যবহার করেন এবং আপনি তাদের নাম A এবং B. রাখেন আপনি যদি নামগুলি ওপ 1 এবং Op2 তে পরিবর্তন করেন তবে আপনি অ্যাড পদ্ধতিটি ভেঙে ফেলবেন। বা আপনার আইডিই আপনার জন্য সমস্ত নাম আপডেট করবে, পয়েন্টটি হ'ল পদ্ধতিটি পাশাপাশি আপডেট করা দরকার কারণ এটির বাহ্যিক সংস্থার উপর নির্ভরতা রয়েছে।

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

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

সুবিধাগুলি: যেহেতু পদ্ধতির পরিবেশের জন্য নির্ভরশীলতাগুলি অপসারণ করা হয়েছে, পদ্ধতিতে পরিবর্তনগুলি পরিবেশের উপর প্রভাব ফেলবে না এবং বিপরীতে। => অ্যাপ্লিকেশনটি বজায় রাখা (পরিবর্তন করা) আরও সহজ হয়ে যায়।

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