প্রকৃতপক্ষে, "সঠিক" উপায়টি হ'ল কারখানাটি ব্যবহার না করা একেবারে অন্য কোনও পছন্দ না থাকলে (যেমন ইউনিট টেস্টিং এবং নির্দিষ্ট উপহাস হিসাবে - প্রোডাকশন কোডের জন্য আপনি কারখানাটি ব্যবহার করেন না)! এটি করা আসলে একটি অ্যান্টি-প্যাটার্ন এবং যেকোন মূল্যে এড়ানো উচিত। একটি দ্বি ধারক পিছনে পুরো পয়েন্ট গ্যাজেট কাজ করতে অনুমতি দেওয়া জন্য আপনি।
যেমনটি পূর্বের পোস্টে উল্লিখিত ছিল, আপনি চাইছেন যে আপনার আইওসি গ্যাজেটটি আপনার অ্যাপ্লিকেশনে বিভিন্ন নির্ভরশীল অবজেক্ট তৈরির জন্য দায়িত্ব গ্রহণ করবে। তার অর্থ আপনার ডিআই গ্যাজেটটি নিজেই বিভিন্ন দৃষ্টান্ত তৈরি করতে ও পরিচালনা করতে দেয়। এটি ডিআই এর পেছনের পুরো বিষয় - আপনার অবজেক্টগুলি কখনই জানেন যে কীভাবে তারা নির্ভর করে বা কীভাবে তৈরি করতে পারে / বা পরিচালনা করতে হয়। অন্যথায় করতে আলগা দম্পতি বিরতি ।
একটি বিদ্যমান অ্যাপ্লিকেশনকে সমস্ত ডিআই-তে রূপান্তর করা একটি বিশাল পদক্ষেপ, তবে এটি করার ক্ষেত্রে সুস্পষ্ট অসুবিধা বাদ দিয়ে আপনি এমন একটি ডিআই সরঞ্জাম অন্বেষণ করতে চাইবেন যা আপনার বাইন্ডিংয়ের বেশিরভাগ অংশ স্বয়ংক্রিয়ভাবে সম্পাদন করবে you (নিনজেক্টের মতো কোনও কিছুর মূলটি হ'ল "kernel.Bind<someInterface>().To<someConcreteClass>()"
সেই ইন্টারফেসগুলি বাস্তবায়নের জন্য আপনি যে কংক্রিট শ্রেণীর ব্যবহার করতে চান তা আপনার ইন্টারফেসের ঘোষণার সাথে মেলে আপনি যে কলগুলি করেছেন It's এটিই "বাইন্ড" কল যা আপনার ডিআই গ্যাজেটটি আপনার কনস্ট্রাক্টর কলগুলিকে বাধা দেয় এবং সরবরাহ সরবরাহ করে প্রয়োজনীয় নির্ভরশীল অবজেক্টের দৃষ্টান্ত।
public class SomeClass
{
private ISomeClassA _ClassA;
private ISomeOtherClassB _ClassB;
public SomeClass(ISomeClassA aInstanceOfA, ISomeOtherClassB aInstanceOfB)
{
if (aInstanceOfA == null)
throw new NullArgumentException();
if (aInstanceOfB == null)
throw new NullArgumentException();
_ClassA = aInstanceOfA;
_ClassB = aInstanceOfB;
}
public void DoSomething()
{
_ClassA.PerformSomeAction();
_ClassB.PerformSomeOtherActionUsingTheInstanceOfClassA(_ClassA);
}
}
মনে রাখবেন যে এই কোডটিতে কোথাও এমন কোনও কোড নেই যা তৈরি করেছে / পরিচালিত / প্রকাশ করেছে স্যামসনক্রিটক্র্যাসা বা সামোরথ্রন্টক্রিটস্লাবের উদাহরণ। প্রকৃতপক্ষে, কোন কংক্রিট শ্রেণি এমনকি রেফারেন্স করা হয়নি। তো ... যাদু কোথায় ঘটল?
আপনার অ্যাপ্লিকেশনটির প্রারম্ভ অংশে নিম্নলিখিতটি ঘটেছে (আবার, এটি সিউডো কোড তবে এটি বাস্তব (নিনেক্ট) জিনিসটির খুব কাছে ...):
public void StartUp()
{
kernel.Bind<ISomeClassA>().To<SomeConcreteClassA>();
kernel.Bind<ISomeOtherClassB>().To<SomeOtherConcreteClassB>();
}
কোডটির এই সামান্য অংশটি নিনজেক্ট গ্যাজেটটিকে নির্মাতাদের সন্ধান করতে, তাদের স্ক্যান করতে, ইন্টারফেসের উদাহরণগুলি সন্ধান করতে বলে যে এটি হ্যান্ডেল করার জন্য কনফিগার করা হয়েছে (এটিই "বাইন্ড" কলগুলি) এবং তারপরে যেখানেই কংক্রিট শ্রেণীর একটি উদাহরণ তৈরি এবং প্রতিস্থাপন করতে পারে tells উদাহরণ উল্লেখ করা হয়।
একটি দুর্দান্ত সরঞ্জাম রয়েছে যা নিনজেক্টকে খুব ভাল বলে নিনজেক্ট নামে পরিচিত করে তোলে x এক্সটেনশনগুলি C কনভেনশনগুলি (আরও একটি নুগেট প্যাকেজ) যা আপনার জন্য এই কাজটি বেশিরভাগ ক্ষেত্রেই করবে। আপনি নিজেরাই এটি তৈরি করার সাথে সাথে দুর্দান্ত শেখার অভিজ্ঞতাটি সরিয়ে নেবেন না, তবে নিজেকে শুরু করার জন্য, এটি অনুসন্ধানের একটি সরঞ্জাম হতে পারে।
যদি মেমরিটি পরিবেশন করে তবে ইউনিটি (আনুষ্ঠানিকভাবে মাইক্রোসফ্ট থেকে এখন একটি ওপেন সোর্স প্রকল্প) একটি পদ্ধতি কল বা দু'জন একই কাজ করে, অন্য সরঞ্জামগুলিতে একই রকম সহায়ক রয়েছে।
আপনি যে কোনও পথ বেছে নিন, অবশ্যই আপনার ডিআই প্রশিক্ষণের বেশিরভাগ অংশের জন্য মার্ক সিমেনের বইটি অবশ্যই পড়ুন, তবে এটি উল্লেখ করা উচিত যে সফটওয়্যার ইঞ্জিনিয়ারিং জগতের "গ্রেট অনস" এমনকি (মার্কের মতো) চমকপ্রদ ত্রুটি করতে পারে - মার্ক সব কিছু ভুলে গিয়েছিল তাঁর বইতে নিনজেক্ট তাই এখানে নিনজেক্টের জন্য রচিত আরও একটি সংস্থান রয়েছে। আমি এটি এবং এটি একটি ভাল পঠন আছে: নির্ভরতা ইনজেকশন জন্য মাস্টারিং নিনজেক্ট