কনস্ট্রাক্টর ইঞ্জেকশনের সুবিধা রয়েছে যে এটি নির্ভরতা সুস্পষ্ট করে তোলে এবং ক্লায়েন্টকে একটি উদাহরণ সরবরাহ করতে বাধ্য করে। এটি গ্যারান্টিও দিতে পারে যে ক্লায়েন্ট পরে উদাহরণটি পরিবর্তন করতে পারে না। এক (সম্ভাব্য) নিম্নরূপটি হ'ল আপনাকে আপনার কনস্ট্রাক্টরে একটি প্যারামিটার যুক্ত করতে হবে।
সেটার ইনজেকশনটির সুবিধা রয়েছে যে এটি নির্মাণে কোনও পরামিতি যুক্ত করার প্রয়োজন নেই 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());
যাইহোক, আমি এখনও পরীক্ষার জন্য বিকল্প বাস্তবায়নে পাস করতে পারি। আমি বুঝতে পারি যে দরিদ্র মানুষের ডিআই দিয়ে আমি আমার নির্ভরতা হার্ডকোড করছি, তবে এটি আমার পক্ষে গ্রহণযোগ্য যেহেতু আমি বেশিরভাগই ডিআই-কে পরীক্ষার জন্য ব্যবহার করি।