নিয়ন্ত্রণ বনাম নির্ভরতা ইনজেকশন


525

মার্টিন ফাউলারের লিখিত কাগজ অনুসারে , নিয়ন্ত্রণের বিপরীততা হ'ল নীতিটি যেখানে কোনও প্রোগ্রামের নিয়ন্ত্রণ প্রবাহকে উল্টানো হয়: প্রোগ্রামারের পরিবর্তে কোনও প্রোগ্রামের প্রবাহকে নিয়ন্ত্রণ করা হয়, বাহ্যিক উত্স (কাঠামো, পরিষেবাদি, অন্যান্য উপাদান) নিয়ন্ত্রণ নেয় এটা। এটি এমন যে আমরা কোনও কিছুতে প্লাগ করি। তিনি EJB 2.0 সম্পর্কে একটি উদাহরণ উল্লেখ করেছেন:

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

এটি কাঠামো এবং গ্রন্থাগারের মধ্যে পার্থক্য বাড়ে:

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

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

তবে, এই কাগজে (পোকোপ্যাপসুল থেকে, সি / সি ++ এর জন্য অন্য আইওসি ফ্রেমওয়ার্ক থেকে), এটি পরামর্শ দেয় যে আইওসি এবং ডিআই-এর কারণে আইওসি পাত্রে এবং ডিআই ফ্রেমওয়ার্কগুলি জে 2 ই এর থেকে অনেক বেশি উন্নত, যেহেতু জে 2 ই ই ফ্রেমওয়ার্ক কোডগুলিকে মিশ্রিত করে , সুতরাং এটি সরল পুরাতন জাভা / সি ++ অবজেক্ট (পোগো / পোকো) তৈরি করে না।

নির্ভরতা ইনজেকশন প্যাটার্ন ব্যতীত অন্য কোনও নিয়ন্ত্রণ পাত্রে বিপরীতকরণ (সংরক্ষণাগার লিঙ্ক)

পুরানো উপাদান-ভিত্তিক বিকাশ কাঠামোতে কী সমস্যা রয়েছে তা বোঝার জন্য অতিরিক্ত পাঠ্য, যা উপরের দ্বিতীয় পেপারের দিকে নিয়ে যায়: কেন এবং নিয়ন্ত্রণের বিপরীতে কী (আর্কাইভ লিঙ্ক)

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


2
এখানে বিষয়, আইওসি বনাম দ্বি (নির্ভরতা উদ্বুদ্ধ) SL বিভাগ: (সার্ভিস লোকেটার) বনাম একটি ভালো কাজের মধ্যে থাকবেন এর tinyurl.com/kk4be58 URL থেকে এক্সট্র্যাক্ট: - আইওসি বনাম দ্বি (নির্ভরতা ইনজেকশন)? আইওসি সাধারণ ধারণা যেখানে প্রবাহ নিয়ন্ত্রণ করা হয় ইনভার্টেড ফ্রেমওয়ার্ক ক্লায়েন্ট কোড, যা "ক্লায়েন্টের জন্য নেই কিছু" থেকে। এসএল (সার্ভিস লোকেটার) এবং ডিআই (ডিপেন্ডেন্সি ইনজেকশন) আইওসি থেকে দূরে দুটি নকশার নিদর্শন।
সোয়াব.জট

আমার দুটি সেন্ট যুক্ত করার জন্য, যদি কেউ কফি শপের থিমে নির্ভরতা ইনজেকশনটি কীভাবে সহায়ক হতে পারে সে সম্পর্কে আগ্রহী হয়, আমি সে সম্পর্কে এখানে একটি নিবন্ধ লিখেছি: digigene.com/design-patterns/d dependency
Ali

3
নতুনদের জন্য শালীন নিবন্ধ asimplify.com/d dependency
খাজা অসীম

নির্ভরতা বিপরীতমুখী: সংক্ষেপে নয়, বিমূর্ততার উপর নির্ভর করে। নিয়ন্ত্রণের বিপরীতে: প্রধান বনাম বিমূর্তি এবং কীভাবে প্রধান সিস্টেমগুলির আঠালো। এটি সম্পর্কে ভাল কথা বলার জন্য কয়েকটি ভাল পোস্ট: coderstower.com/2019/03/26/… coderstower.com/2019/04/02/… coderstower.com/2019/04/09/…
ড্যানিয়েল আন্দ্রেস পেলেজ লোপেজ

এই গভীর সম্পর্কে পড়ুন, এটি সমস্ত martinfowler.com/articles/…
দুশমন

উত্তর:


644

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

ডিআই হ'ল আইওসি-র একটি রূপ, যেখানে কনস্ট্রাক্টর / সেটার / সার্ভিস লুপআপের মাধ্যমে বাস্তবায়নগুলি কোনও বস্তুর মধ্যে প্রেরণ করা হয়, যা সঠিকভাবে আচরণের জন্য অবজেক্টটি 'নির্ভর করবে'।

ডিও ব্যবহার না করে আইওসি , উদাহরণস্বরূপ টেমপ্লেট প্যাটার্ন হবে কারণ বাস্তবায়ন কেবলমাত্র সাব-ক্লাসিংয়ের মাধ্যমে পরিবর্তন করা যেতে পারে।

ডিআই ফ্রেমওয়ার্কগুলি ডিআই-র ব্যবহারের জন্য ডিজাইন করা হয়েছে এবং এটি প্রয়োগগুলিতে পাস করা সহজ করার জন্য ইন্টারফেসগুলি (বা জাভাতে টিকা) সংজ্ঞায়িত করতে পারে।

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

এই মার্টিন ফাউলারের নিবন্ধটিও দেখুন


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

5
ইজেবি পরিচালনা সত্যিই আইওসির একটি আদর্শ উদাহরণ। আপনি এটি দেখতে পাচ্ছেন যে কোনও ইজেবির জীবনচক্রটি প্রোগ্রামার দ্বারা নয়, ধারক দ্বারা পরিচালিত হয়। প্রোগ্রামার তৈরি বা কারণ একটি EJB উদাহরণস্বরূপ ধ্বংস নেই নিয়ন্ত্রণ সার্ভারে অর্পণ করা হয় । এটি আইওসি-র ধারণা: আপনার কোডটি কল করার সময় বাহ্যিক কোড নিয়ন্ত্রণ করে যা সাধারণত বেশিরভাগ সময় যা করত তার বিপরীত হয়।
ব্র্যান্ডজিজি

2
আইওসি হল একটি জেনেরিক শব্দ যার অর্থ অ্যাপ্লিকেশনটিকে কোনও কাঠামোর মধ্যে পদ্ধতিগুলি কল করার চেয়ে ফ্রেমওয়ার্কটি অ্যাপ্লিকেশন দ্বারা সরবরাহিত বাস্তবায়নকে কল করে। আপনি এই সম্পর্কে আরও ব্যাখ্যা করতে পারেন?
ইমাদ আলাজানী

21
আকা হলিউডের নীতি , 'আমাদের ডাকবেন না, আমরা আপনাকে ডাকব'। অনুরোধটি প্রয়োগের চেয়ে ফ্রেমওয়ার্কে ছেড়ে দেয়।
গ্যারেট হল

@ ইমাদ আলাজানী, আপনি গ্যারেট সংযুক্ত নিবন্ধটির মাধ্যমে আরও ভালভাবে পড়তে চাইবেন, যা অ্যাপ্লিকেশন কোড থেকে কাঠামোয় নিয়ন্ত্রণটি উল্টে দেওয়ার বিষয়ে বিশদ আলোচনা।
MengT

210

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

ইনভার্শন অফ কন্ট্রোল (আইওসি) বলতে মূলত এমন কোনও প্রোগ্রামিং স্টাইল বোঝায় যেখানে সামগ্রিক কাঠামো বা রান-টাইম প্রোগ্রাম প্রবাহকে নিয়ন্ত্রণ করে

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

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

ডিপেন্ডেন্সি ইনজেকশন (ডিআই) এর অর্থ এটি সাধারণত অবজেক্টের হস্তক্ষেপ ছাড়াই করা হয়, সাধারণত কাঠামোর উপাদান যা কনস্ট্রাক্টর প্যারামিটারগুলি এবং সেট বৈশিষ্ট্যগুলি পাস করে by


1
দেখে মনে হচ্ছে আইওসি হ'ল ডিপেন্সি ইনভার্সন নীতিটির অন্য একটি শব্দ, না?
টড ভ্যান্স

@ টডভান্স - হ্যাঁ, আমি মনে করি আইওসি এবং ডিআইপি একই জিনিস। ডিআইপি এবং ডিআই একই জিনিস নয়। আইওসি ডিআই ছাড়া করা যায়, তবে আইওসি ছাড়া ডিআই করা যায় না।
এলজয়

2
@ টডভান্স - না, ডিআইপি এবং আইওসি সমার্থক শব্দ নয় এবং সম্পর্কিত নয়।
টিএসমিথ

3
হ্যাঁ, এজন্যই আমি এই থ্রেডে এসেছি ... "নিয়ন্ত্রণ বনাম নির্ভরতা ইনজেকশন ইনভার্জান"
টড ভ্যানস

49

ডিআই হ'ল আইওসির একটি উপসেট

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

আইওসি অর্জনের জন্য আরও কিছু কৌশল এখানে রয়েছে


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

49

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

আইওসি ( আমি n সংস্করণ সি ontrol): - এটি একটি জেনেরিক শব্দ এবং বিভিন্নভাবে (ঘটনা, প্রতিনিধিদের ইত্যাদি) প্রয়োগ করা হয়।

ডিআই ( ডি এপেন্ডেন্সি আই নাকশন): - ডিআই হ'ল উপ-প্রকারের আইওসি এবং এটি কনস্ট্রাক্টর ইনজেকশন, সেটার ইনজেকশন বা ইন্টারফেস ইনজেকশন দ্বারা প্রয়োগ করা হয় ।

তবে, বসন্ত কেবলমাত্র দুটি ধরণের সমর্থন করে:

  • সেটার ইনজেকশন
    • সেটার-ভিত্তিক ডিআই ব্যবহারকারীর মটরশুটিতে সেটার পদ্ধতিগুলি কল করার মাধ্যমে উপলব্ধ হয় কোনও বিনা যুক্তিযুক্ত কনস্ট্রাক্টর বা নো-আর্গুমেন্ট স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি তাদের শিমটি ইনস্ট্যান্ট করার জন্য।
  • কনস্ট্রাক্টর ইনজেকশন
    • কন্সট্রাক্টর-ভিত্তিক ডিআই একটি কনস্ট্রাক্টরকে বিভিন্ন যুক্তি সহ প্রত্যেকটি সহযোগী হিসাবে উপস্থাপনের মাধ্যমে উপলব্ধি করা যায় this এটি ব্যবহার করে আমরা যাচাই করতে পারি যে ইনজেকশনের মটরশুটিগুলি শূন্য নয় এবং দ্রুত ব্যর্থ হয় (সংকলনের সময় ব্যর্থ হয় এবং রান-টাইমে নয়), তাই অ্যাপ্লিকেশন শুরু করার সময় আমরা নিজেই পাই NullPointerException: bean does not exist। কনস্ট্রাক্টর ইনজেকশন নির্ভরতা ইনজেকশনের সেরা অনুশীলন।

1
এটি উল্লেখ করে সঠিক নয় যে বসন্ত সম্পত্তি ইনজেকশন সমর্থন করে না। এটা করে. এবং এটি একটি খারাপ অনুশীলন, আমি একমত।
kekko12

স্প্রিং @ অটোভায়ার্ড টীকাগুলি আমার মতে সম্পত্তি ইনজেকশনের একটি উপায়
সাজিত

19

যেহেতু সমস্ত উত্তর তত্ত্বের উপর জোর দেয় আমি একটি উদাহরণ প্রথম পদ্ধতির সাথে প্রদর্শন করতে চাই:

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

public class SMSService
{
    public void SendSMS(string mobileNumber, string body)
    {
        SendSMSUsingGateway(mobileNumber, body);
    }

    private void SendSMSUsingGateway(string mobileNumber, string body)
    {
        /*implementation for sending SMS using gateway*/
    }
}

public class UIHandler
{
    public void SendConfirmationMsg(string mobileNumber)
    {
        SMSService _SMSService = new SMSService();
        _SMSService.SendSMS(mobileNumber, "Your order has been shipped successfully!");
    }
}

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

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

public interface ISMSService
{
    void SendSMS(string phoneNumber, string body);
}

তারপরে (আইএসএমএসএসওয়ারি) ইন্টারফেসটি বাস্তবায়নের জন্য আমরা আমাদের (এসএমএসএসওয়ারি) বাস্তবায়নটি পরিবর্তন করব:

public class SMSService : ISMSService
{
    public void SendSMS(string mobileNumber, string body)
    {
        SendSMSUsingGateway(mobileNumber, body);
    }

    private void SendSMSUsingGateway(string mobileNumber, string body)
    {
        /*implementation for sending SMS using gateway*/
        Console.WriteLine("Sending SMS using gateway to mobile: 
        {0}. SMS body: {1}", mobileNumber, body);
    }
}

এখন আমরা একই ইন্টারফেস ব্যবহার করে সম্পূর্ণ ভিন্ন বাস্তবায়ন সহ নতুন মক আপ পরিষেবা (মকএসএমএসসিভারসিয়া) তৈরি করতে সক্ষম হব:

public class MockSMSService :ISMSService
{
    public void SendSMS(string phoneNumber, string body)
    {
        SaveSMSToFile(phoneNumber,body);
    }

    private void SaveSMSToFile(string mobileNumber, string body)
    {
        /*implementation for saving SMS to a file*/
        Console.WriteLine("Mocking SMS using file to mobile: 
        {0}. SMS body: {1}", mobileNumber, body);
    }
}

এই মুহুর্তে, পরিষেবার (মকএসএমএসএসভিয়ার) কংক্রিট বাস্তবায়নের জন্য নীচের হিসাবে সহজেই ব্যবহার করতে আমরা (ইউআইএইচ্যান্ডলার) কোডটি পরিবর্তন করতে পারি:

public class UIHandler
{
    public void SendConfirmationMsg(string mobileNumber)
    {
        ISMSService _SMSService = new MockSMSService();
        _SMSService.SendSMS(mobileNumber, "Your order has been shipped successfully!");
    }
}

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

এটি অর্জনের জন্য আমাদের (UIHandler) শ্রেণীর কনস্ট্রাক্টর এর মাধ্যমে নির্ভরতা পাস করার জন্য একটি পরিবর্তন বাস্তবায়ন করতে হবে, এটি করে, যে কোডটি (UIHandler) ব্যবহার করে তা নির্ধারণ করতে পারে (ISMSS servis) এর কোন কংক্রিট প্রয়োগ করা উচিত:

public class UIHandler
{
    private readonly ISMSService _SMSService;

    public UIHandler(ISMSService SMSService)
    {
        _SMSService = SMSService;
    }

    public void SendConfirmationMsg(string mobileNumber)
    {
        _SMSService.SendSMS(mobileNumber, "Your order has been shipped successfully!");
    }
}

এখন UI ফর্ম যা ক্লাস (UIHandler) এর সাথে কথা বলবে তা ইন্টারফেসের (ISMSS सर्विस) প্রয়োগের কোনটি পাস করার জন্য দায়বদ্ধ। এর অর্থ আমরা নিয়ন্ত্রণটি উল্টে দিয়েছি, কলিং কোডটি কোন প্রয়োগটি ব্যবহার করবে তা সিদ্ধান্ত নেওয়ার জন্য আর (ইউআইএইচ্যান্ডলার) দায়বদ্ধ নয়। আমরা ইনভার্সন অফ কন্ট্রোল নীতিটি কার্যকর করেছি যা ডিআই হ'ল এক প্রকারের।

ইউআই ফর্ম কোড নীচের মত হবে:

class Program
{
    static void Main(string[] args)
    {
        ISMSService _SMSService = new MockSMSService(); // dependency

        UIHandler _UIHandler = new UIHandler(_SMSService);
        _UIHandler.SendConfirmationMsg("96279544480");

        Console.ReadLine();
    }
}

দুর্দান্ত ব্যাখ্যা
ZiviMagic

19

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

ডিআই (ডিপেন্ডেন্সি ইনজেকশন) : কোনও বস্তুতে বৈশিষ্ট্যগুলি ইনজেকশনের উপায়কে নির্ভরতা ইনজেকশন বলা হয় ।

আমাদের তিন ধরনের নির্ভরতা ইনজেকশন রয়েছে :

  1. কনস্ট্রাক্টর ইনজেকশন
  2. সেটার / গেটর ইনজেকশন
  3. ইন্টারফেস ইনজেকশন

বসন্ত কেবল কনস্ট্রাক্টর ইঞ্জেকশন এবং সেটার / গেটর ইঞ্জেকশনকে সমর্থন করে


5

তবে বসন্তের ডকুমেন্টেশন বলে যে তারা একই রকম।

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-introduction

প্রথম লাইনে " আইওসি নির্ভরতা ইনজেকশন (ডিআই) হিসাবেও পরিচিত "।


1
আমি অনুমান করি যে তারা কীভাবে সম্বোধন করার চেষ্টা করেছিল তা হ'ল ডিআই আইওসি ডিজাইনের প্যাটার্নের একটি বহুল ব্যবহৃত স্বাদ যা এটি প্রায় সহজেই আইওসি ওরফে ডিআই নামে অভিহিত হতে পারে - ডকুমেন্টেশনে কোনও স্পষ্ট উল্লেখ নেই যা অন্যথায় প্রস্তাব দেয়।
ha9u63ar

5
"আইওসি নির্ভরতা ইনজেকশন (ডিআই) হিসাবেও পরিচিত" ... ঘোড়াফ্যাথাররা!
মাইকম

5

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

ডিআই - ডিপেন্ডেন্সি ইনজেকশন হ'ল কংক্রিট শব্দ, যার মধ্যে আমরা বিভিন্ন সময় ইনজেকশন কৌশলগুলি ব্যবহার করে রানের সময় অবজেক্টের নির্ভরতা সরবরাহ করি। সেটার ইঞ্জেকশন, কনস্ট্রাক্টর ইঞ্জেকশন বা ইন্টারফেস ইনজেকশন দ্বারা।


4

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

নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করার জন্য বেশ কয়েকটি বেসিক কৌশল রয়েছে। এইগুলো:

  • কারখানার প্যাটার্ন ব্যবহার করা
  • একটি পরিষেবা লোকেটার প্যাটার্ন ব্যবহার করে
  • নীচে দেওয়া যেকোন একটি নির্ভরতা ইনজেকশন ব্যবহার করে:

    1)। একটি কনস্ট্রাক্টর ইনজেকশন
    2)। একটি সেটার ইনজেকশন
    3)। একটি ইন্টারফেস ইনজেকশন

4

ডিআই এবং আইওসি দুটি ডিজাইন প্যাটার্ন যা মূলত উপাদানগুলির মধ্যে loose িলেlingালা মিশ্রণ সরবরাহ করার উপর দৃষ্টি নিবদ্ধ করে , বা কেবল এমন এক উপায় যার মাধ্যমে আমরা বস্তুর মধ্যে প্রচলিত নির্ভরতা সম্পর্ক ডিক্লুপ করি যাতে বস্তু একে অপরের সাথে আঁটসাঁড়ে না থাকে are

নিম্নলিখিত উদাহরণগুলির সাথে, আমি এই দুটি ধারণাটি ব্যাখ্যা করার চেষ্টা করছি।

আগে আমরা এই জাতীয় কোড লিখছি

Public MyClass{
 DependentClass dependentObject
 /*
  At somewhere in our code we need to instantiate 
  the object with new operator  inorder to use it or perform some method.
  */ 
  dependentObject= new DependentClass();
  dependentObject.someMethod();
}

নির্ভরতা ইনজেকশন সহ, নির্ভরতা ইনজেক্টর অবজেক্টগুলির ইনস্ট্যান্টেশন যত্ন নেবে

Public MyClass{
 /* Dependency injector will instantiate object*/
 DependentClass dependentObject

 /*
  At somewhere in our code we perform some method. 
  The process of  instantiation will be handled by the dependency injector
 */ 

  dependentObject.someMethod();
}

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

আইওসি হ'ল নীতি যেখানে কোনও প্রোগ্রামের নিয়ন্ত্রণ প্রবাহকে বিপরীত করা হয়: প্রোগ্রামারের পরিবর্তে প্রোগ্রামার প্রবাহকে নিয়ন্ত্রণ করে প্রোগ্রামার ওভারহেড হ্রাস করে প্রোগ্রামটি প্রবাহকে নিয়ন্ত্রণ করে by এবং নির্ভরতা ইনজেক্ট করতে প্রোগ্রাম দ্বারা ব্যবহৃত প্রক্রিয়া হিসাবে চিহ্নিত হয় দ্বি

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

পড়ার জন্যও সুপারিশ করুন।

নির্ভরতা ইনজেকশন কী?

আপনি আমার অনুরূপ উত্তরগুলির একটি এখানেও পরীক্ষা করতে পারেন

নিয়ন্ত্রণ এবং নির্ভরতা ইনজেকশন এর বিপরীতে পার্থক্য


3

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

এটি এমন একটি ডিজাইনের নীতি যাতে জেনেরিক-লিখিত গ্রন্থাগার বা পুনরায় ব্যবহারযোগ্য কোড থেকে নিয়ন্ত্রণের ফ্লো "প্রাপ্ত" করা হয়েছে।

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

print ("Please enter your name:");
scan (&name);
print ("Please enter your DOB:");
scan (&dob);

//More print and scan statements
<Do Something Interesting>

//Call a Library function to find the age (common code)
print Age

বিপরীতে আইওসির সাথে ফ্রেমওয়ার্কগুলি পুনরায় ব্যবহারযোগ্য কোড যা ব্যবসায়িক যুক্তি "কল" করে।

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

যদিও, কাঠামোর কোডটি আমার ব্যবসায়ের যুক্তি সম্পর্কে অবগত নয়, এটি এখনও আমার কোডটি কল করতে হবে know ইভেন্ট / প্রতিনিধি, কলব্যাক ইত্যাদি ব্যবহার করে এটি অর্জন করা হয় Here এখানে প্রবাহের নিয়ন্ত্রণটি "বিপরীত"।

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

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

সহজ কথায়, আপনি কোড লেখার চেষ্টা করার সময়, আপনি বিভিন্ন ক্লাস তৈরি এবং ব্যবহার করবেন। একটি শ্রেণি (ক্লাস এ) অন্যান্য ক্লাস (ক্লাস বি এবং / অথবা ডি) ব্যবহার করতে পারে। সুতরাং, ক্লাস বি এবং ডি ক্লাস এ এর ​​নির্ভরতা are

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

নির্ভরতা ইনজেকশন পরামর্শ দেয় যে ডিপেন্ডেন্ট ক্লাসগুলির পরিবর্তে (ক্লাস কার এখানে) তার নির্ভরতা (ক্লাস ইঞ্জিন এবং ক্লাস টায়ার) তৈরি করার পরিবর্তে ক্লাসকে নির্ভরতার দৃ concrete় উদাহরণ দিয়ে ইঞ্জেকশন করা উচিত।

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

Class TextEditor
{

    //Lot of rocket science to create the Editor goes here

    EnglishSpellChecker objSpellCheck;
    String text;

    public void TextEditor()

    {   

        objSpellCheck = new EnglishSpellChecker();

    }

    public ArrayList <typos> CheckSpellings()
    {

        //return Typos;

    }

}

প্রথম দর্শনে, সমস্ত গোলাপী দেখায়। ব্যবহারকারী কিছু লেখা লিখবেন will বিকাশকারী পাঠ্যটি ক্যাপচার করবে এবং চেকস্পিলিং ফাংশনটিতে কল করবে এবং টাইপসের একটি তালিকা খুঁজে পাবে যা সে ব্যবহারকারীর কাছে প্রদর্শন করবে।

যখন কোনও ব্যবহারকারী সম্পাদনায় ফরাসী লেখা শুরু করে তখন একটি দুর্দান্ত দিন পর্যন্ত সবকিছু দুর্দান্ত কাজ করবে বলে মনে হচ্ছে।

আরও ভাষার জন্য সমর্থন সরবরাহ করতে, আমাদের আরও স্পেলচেকার থাকতে হবে। সম্ভবত ফরাসি, জার্মান, স্প্যানিশ ইত্যাদি

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

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

interface ISpellChecker
{

    Arraylist<typos> CheckSpelling(string Text);

}

Class EnglishSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}



Class FrenchSpellChecker : ISpellChecker

{

    public override Arraylist<typos> CheckSpelling(string Text)

    {

        //All Magic goes here.

    }

}

আমাদের উদাহরণস্বরূপ, টেক্সটএডিটর শ্রেণীর ISpellChecker প্রকারের কংক্রিট উদাহরণ পাওয়া উচিত।

এখন, নির্ভরতা কন্সট্রাক্টর, একটি পাবলিক সম্পত্তি বা কোনও পদ্ধতিতে ইনজেকশন দেওয়া যেতে পারে।

কনস্ট্রাক্টর ডিআই ব্যবহার করে আমাদের ক্লাস পরিবর্তন করার চেষ্টা করি। পরিবর্তিত টেক্সটএডিটর শ্রেণিটি এরকম কিছু দেখবে:

Class TextEditor

{

    ISpellChecker objSpellChecker;

    string Text;



    public void TextEditor(ISpellChecker objSC)

    {

        objSpellChecker = objSC;

    }



    public ArrayList <typos> CheckSpellings()

    {

        return objSpellChecker.CheckSpelling();

    }

}

যাতে কলিং কোডটি পাঠ্য সম্পাদক তৈরি করার সময় পাঠ্যপরিচয়কারীর উদাহরণে উপযুক্ত বানানচিকার প্রকারটি ইনজেক্ট করতে পারে।

আপনি এখানে সম্পূর্ণ নিবন্ধটি পড়তে পারেন


3

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

ডিআই (ডিপেন্ডেন্সি ইনজেকশন): এক্সএমএল থেকে কোনও বস্তুর (POJO CLASS এ) প্রয়োজনীয় প্যারামিটারগুলি (বৈশিষ্ট্য) পাস করার ক্ষেত্রে তাকে নির্ভরতা ইনজেকশন বলা হয়।


2

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

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

ডিআই হ'ল সেটার ইনজেকশন বা কনস্ট্রাক্টর ইনজেকশন ব্যবহার করে রানের সময় কোনও জিনিসের নির্ভরতা সরবরাহ করার প্রক্রিয়া।


2

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

নিয়ন্ত্রণের বিপরীতমুখীকরণ: - নির্ভরতাগুলি দ্বিগুণ করতে এবং তাদের বিধানটি অর্পণ করার জন্য এটি একটি সাধারণ শব্দ এবং এটি বিভিন্ন উপায়ে (ইভেন্ট, প্রতিনিধি ইত্যাদি) প্রয়োগ করা যেতে পারে।

নির্ভরতা ইনজেকশন: - ডিআই হ'ল আইওসির একটি সাব টাইপ এবং এটি কনস্ট্রাক্টর ইনজেকশন, সেটার ইঞ্জেকশন বা পদ্ধতি ইনজেকশন দ্বারা প্রয়োগ করা হয়।

নিম্নলিখিত নিবন্ধটি খুব সুন্দরভাবে এটি বর্ণনা করে describe

https://www.codeproject.com/Articles/592372/Dependency-Injection-DI-vs-Inversion-of-Control-IO


1

আমি মনে করি অবজেক্ট অরিয়েন্টেড আগাছা না পেয়ে ধারণাটি স্পষ্টভাবে প্রদর্শিত হতে পারে, যা ধারণাটিকে গোলমেলে মনে হয়।

// dependency injection
function doSomething(dependency) {
    // do something with your dependency
}

// in contrast to creating your dependencies yourself
function doSomething() {
    dependency = getDependencySomehow()
}

// inversion of control
application = makeApp(authenticate, handleRequest, sendResponse)
application.run(getRequest())

// in contrast to direct control or a "library" style
application = makeApp()
request = application.getRequest()

if (application.authenticate(request.creds)) {
    response = application.handleRequest(request)
    application.sendResponse(response)
}

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


0

আসুন সলাইডের ডি দিয়ে শুরু করুন এবং স্কট মিললেট এর বই "পেশাদার এএসপি.এনইটি ডিজাইনের প্যাটার্নস" থেকে ডিআই এবং আইওসি দেখুন:

নির্ভরতা বিপরীতমুখী মূলনীতি (ডিআইপি)

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

নির্ভরতা ইনজেকশন (ডিআই) এবং নিয়ন্ত্রণের বিপরীতমুখী (আইওসি)

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

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

মিললেট, সি (২০১০) পেশাদার এএসপি.এনইটি ডিজাইনের প্যাটার্নস। উইলে পাবলিশিং। 7-8।


0

// আইসিও, ডিআই, 10 বছর আগে, এই তারা ছিল:

public class  AuditDAOImpl implements Audit{

    //dependency
    AuditDAO auditDAO = null;
        //Control of the AuditDAO is with AuditDAOImpl because its creating the object
    public AuditDAOImpl () {
        this.auditDAO = new AuditDAO ();
    }
}

এখন স্প্রিংয়ের সাথে 3,4 বা এটির নীচে সর্বশেষতম

public class  AuditDAOImpl implements Audit{

    //dependency

     //Now control is shifted to Spring. Container find the object and provide it. 
    @Autowired
    AuditDAO auditDAO = null;

}

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


0

আমি জোন.কম এ সেরা উদাহরণ পেয়েছি যা আইওসি এবং ডিআইয়ের মধ্যে প্রকৃত ভিন্নতা বোঝার জন্য সত্যই সহায়ক

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

   DI(Dependency Injection):  Way of injecting properties to an object is 
   called 
  Dependency injection.
   We have three types of Dependency injection
    1)  Constructor Injection
    2)  Setter/Getter Injection
    3)  Interface Injection
   Spring will support only Constructor Injection and Setter/Getter Injection.

সম্পূর্ণ নিবন্ধটি আইওসি পড়ুন এবং সম্পূর্ণ নিবন্ধ পড়ুন ডিআই


0

1) ডিআই হ'ল চাইল্ড-> আপত্তি পিতা-মাতার উপর নির্ভর করে। ক্রিয়া নির্ভর গুরুত্বপূর্ণ। 2) আইওসি হ'ল চাইল্ড-> আপত্তি একটি প্ল্যাটফর্মের অধীনে সম্পাদন করে। যেখানে প্ল্যাটফর্মটি স্কুল, কলেজ, নাচের ক্লাস হতে পারে। এখানে সঞ্চালন হ'ল যে কোনও প্ল্যাটফর্ম সরবরাহকারীর অধীনে বিভিন্ন জড়িত একটি ক্রিয়াকলাপ।

ব্যবহারিক উদাহরণ: `

//DI
child.getSchool();
//IOC
child.perform()// is a stub implemented by dance-school
child.flourish()// is a stub implemented by dance-school/school/

`

-AB


0

এই প্রশ্নের হিসাবে, আমি বলতে চাই যে উইকি ইতিমধ্যে বিস্তারিত এবং সহজে বোঝার ব্যাখ্যা সরবরাহ করেছে। আমি এখানে সবচেয়ে উল্লেখযোগ্য উদ্ধৃত করব।

আইওসি বাস্তবায়ন

অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে নিয়ন্ত্রণের বিপরীকরণ বাস্তবায়ন করার জন্য বেশ কয়েকটি বেসিক কৌশল রয়েছে। এইগুলো:

  1. সার্ভিস লোকেটার প্যাটার্নটি নির্ভরতা ইনজেকশন ব্যবহার করে উদাহরণস্বরূপ কনস্ট্রাক্টর ইনজেকশন প্যারামিটার ইনজেকশন সেটার ইনজেকশন ইন্টারফেস ইনজেকশন;
  2. একটি প্রাসঙ্গিক বর্ণন ব্যবহার করে;
  3. টেমপ্লেট পদ্ধতি ডিজাইনের প্যাটার্ন ব্যবহার করে;
  4. কৌশল নকশা প্যাটার্ন ব্যবহার

নির্ভরতা ইনজেকশন হিসাবে

নির্ভরতা ইনজেকশন এমন একটি কৌশল যা একটি বস্তু (বা স্ট্যাটিক পদ্ধতি) অন্য কোনও বস্তুর নির্ভরতা সরবরাহ করে। নির্ভরতা হ'ল এমন একটি বস্তু যা ব্যবহার করা যায় (একটি পরিষেবা)। একটি ইঞ্জেকশন হ'ল নির্ভরশীল অবজেক্টের (ক্লায়েন্ট) যে এটি ব্যবহার করবে তার উপর নির্ভরতা পাস করা।


0

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

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

সেই অর্থে ডিআই আইও সি -র মতো নয়, যেহেতু এটি নিয়ন্ত্রণ-প্রবাহ সম্পর্কে নয়, তবে এটি এক ধরণের আইও * , অর্থাৎ বস্তু-সৃষ্টির মালিকানার বিপর্যয় ion

আমার ডিআই এবং আইওসি ব্যাখ্যা করার পদ্ধতিতে কী ভুল?

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