নির্ভরতা ইনজেকশন এবং সিঙ্গলটন le এগুলি কি দুটি সম্পূর্ণ ভিন্ন ধারণা?


17

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

নীচের কোড স্নিপেট একবার দেখুন।

    IMathFace obj = Singleton.Instance;

    SingletonConsumer singConsumer = new SingletonConsumer(obj);

    singConsumer.ConsumerAdd(10,20);

SingletonConsumerধরনের একটি প্যারামিটার গ্রহণ করা হয় IMathFace। অভ্যন্তরীণভাবে সিঙ্গলটন ক্লাস অ্যাক্সেস করার পরিবর্তে, SingletonConsumerকলকারী দ্বারা সিঙ্গলটন উদাহরণটি পাবে। নির্ভরতা ইনজেকশনের মাধ্যমে সিঙ্গেলটন ক্লাস গ্রহণের কি এটি একটি ভাল উদাহরণ?


আপনি কী আমাকে ডিআই সিঙ্গলটন প্রতিস্থাপন করতে পারেন দয়া করে বলতে পারেন?

7
সিঙ্গলটন হ'ল ডিজাইনের ধরণ। ডিআই / আইওসি একটি কৌশল।
ডেভ

2
কলা কার্বুরেটর প্রতিস্থাপন করতে পারে তার চেয়ে ডিআই সিঙ্গেলটনকে আর প্রতিস্থাপন করতে পারে না। এগুলি সম্পূর্ণ আলাদা ধারণা।
ডেভ

সুতরাং আমার উদাহরণ বৈধ।

1
হ্যাঁ, তবে এটি এনক্যাপসুলেশন ব্যয় করতে পারে (এটি নন-সিঙ্গলটনের ক্ষেত্রেও সত্য) দেখুন: স্ট্যাকওভারফ্লো

উত্তর:


17

আমি মনে করি তার অর্থ হ'ল স্ট্যাটিক অ্যাকসেসরের সাহায্যে ক্লাসিকাল সিঙ্গেলটন বাস্তবায়নটি ব্যবহার না করে আপনার পরিষেবার একক উদাহরণ ইনজেকশনের জন্য নির্ভরতা ইনজেকশনটি ব্যবহার করা উচিত MySingleton.Instance

public class MySingleton
{
    public static MySingleton Instance{get{...}};
}

ক্লাসিকাল সিঙ্গলটন বাস্তবায়নের সাথে সাথে আপনার সমস্ত কোড সেই পরিষেবাটি সিঙ্গলটন হওয়ার উপর নির্ভর করে। আপনি যখনই ব্যবহার করবেন তখন মূলত আপনি হার্ডকোডটিকে গ্রাহক কোডের মধ্যে অনুভূত করেন MySingleton.Instance

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

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


4

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

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


3

একটি ক্ষেত্রে আছে যেখানে সিঙ্গলটন প্যাটার্ন এবং ডিআই / আইওসি ছেদ করে - একটি সিঙ্গেলনের ইনজেকশন।

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


2

এখানে বিভ্রান্তিটি হ'ল দুটি ধারণাগুলি মিলে গেছে: সিঙ্গলটন এবং স্ট্যাটিক অ্যাকসেসর / সিঙ্গলটনের দৃষ্টান্তের প্রবেশদ্বার।

আপনি যেমনটি যথাযথভাবে সনাক্ত করেছেন, আপনার সহকর্মী পরামর্শ দিচ্ছেন যে সরাসরি Singleton.Instance(স্থির প্রবেশদ্বার) ব্যবহার করে নির্ভরতা ইনজেকশনের পরিবর্তে ইনজেকশনের করা হবে ।

সিঙ্গলটন প্যাটার্নটির সাথে এর আসলে কোনও সম্পর্ক নেই যে কারণটি হ'ল একই ডিআই ধারণাটি একটি নন-সিঙ্গলটন অবজেক্টের সাথে ইনস্ট্যান্ট করতে সমানভাবে প্রযোজ্য new Foo()। নির্ভরতা এটি সিঙ্গলটন বাস্তবায়ন কিনা তা নির্বিশেষে ইনজেকশন দেওয়া হবে।

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