আমি মনে করি যে কোনও পরিষেবা লোকেটারের চেয়ে ডিআই কনটেইনারের চেয়ে দু'জনের মধ্যে পার্থক্যটি বোঝার সবচেয়ে সহজ উপায় হ'ল আমরা কেন প্রথম স্থানে নির্ভরতা বিপরীতে করি about
আমরা নির্ভরতা বিপরীতমুখী করি যাতে প্রতিটি শ্রেণি স্পষ্টভাবে বলতে পারে যে এটি অপারেশনের জন্য নির্ভর করে । আমরা এটি করি কারণ এটি আমাদের অর্জন করতে সবচেয়ে শিথিল যুগল তৈরি করে। আলগা দম্পতিটি, পরীক্ষা এবং রিফ্যাক্টর সহজতর কিছু (এবং সাধারণত ভবিষ্যতে কমপক্ষে রিফ্যাক্টরিংয়ের প্রয়োজন হয় কারণ কোডটি পরিষ্কার থাকে)।
আসুন নীচের ক্লাসটি দেখুন:
public class MySpecialStringWriter
{
private readonly IOutputProvider outputProvider;
public MySpecialFormatter(IOutputProvider outputProvider)
{
this.outputProvider = outputProvider;
}
public void OutputString(string source)
{
this.outputProvider.Output("This is the string that was passed: " + source);
}
}
এই শ্রেণিতে, আমরা স্পষ্ট করে বলছি যে আমাদের একটি আইওপুটপ্রভাইডার প্রয়োজন এবং এই শ্রেণীর কাজটি করার জন্য আর কিছুই নয়। এটি সম্পূর্ণ পরীক্ষামূলক এবং একক ইন্টারফেসের উপর নির্ভরতা রয়েছে has আমি এই ক্লাসটি আমার অ্যাপ্লিকেশনের যে কোনও জায়গায় নিয়ে যেতে পারি, একটি পৃথক প্রকল্প সহ এবং আইওআউটপুটপ্রাইডার ইন্টারফেসের অ্যাক্সেসের জন্য এটির প্রয়োজন। অন্যান্য বিকাশকারীরা যদি এই শ্রেণিতে নতুন কিছু যুক্ত করতে চান, যার জন্য দ্বিতীয় নির্ভরতা প্রয়োজন, তাদের কনস্ট্রাক্টরের কী প্রয়োজন তা সম্পর্কে তাদের স্পষ্ট থাকতে হবে ।
পরিষেবা লোকেটার সহ একই ক্লাসে একবার দেখুন:
public class MySpecialStringWriter
{
private readonly ServiceLocator serviceLocator;
public MySpecialFormatter(ServiceLocator serviceLocator)
{
this.serviceLocator = serviceLocator;
}
public void OutputString(string source)
{
this.serviceLocator.OutputProvider.Output("This is the string that was passed: " + source);
}
}
এখন আমি সার্ভিস লোকেটারকে নির্ভরতা হিসাবে যুক্ত করেছি। এখানে সমস্যাগুলি যা তাত্ক্ষণিকভাবে সুস্পষ্ট:
- এটির সাথে প্রথম সমস্যাটি হ'ল একই ফলাফলটি পেতে আরও কোড লাগে । আরও কোড খারাপ। এটি বেশি কোড নয় তবে এটি আরও বেশি।
- দ্বিতীয় সমস্যাটি হ'ল আমার নির্ভরতা আর স্পষ্ট নয় । আমার এখনও ক্লাসে কিছু ইনজেকশন করা দরকার। আমি চাই জিনিসটি বাদে এখন স্পষ্ট নয়। আমি অনুরোধ করেছি এমন একটি জিনিসে এটি গোপন রয়েছে। এখন আমি ক্লাসটি অন্য কোনও সমাবেশে স্থানান্তর করতে চাইলে সার্ভিস লোকেশন এবং আইওউটপুটপ্রভাইডার উভয়েরই আমার অ্যাক্সেস দরকার।
- তৃতীয় সমস্যাটি হ'ল একটি অতিরিক্ত নির্ভরতা অন্য বিকাশকারী দ্বারা গ্রহণ করা যেতে পারে যারা ক্লাসে কোড যুক্ত করার পরে তারা তা গ্রহণ করছে তা বুঝতে পারেন না' re
- অবশেষে, এই কোডটি পরীক্ষা করা আরও কঠিন (এমনকি সার্ভিসলোকেটার একটি ইন্টারফেস হলেও) কারণ আমাদের কেবলমাত্র আইওউটপুটপ্রাইডারের পরিবর্তে সার্ভিস লোকেশন এবং আইওউটপুটপ্রাইডারকে উপহাস করতে হবে
তাহলে আমরা কেন পরিষেবা লোকেটারকে একটি স্ট্যাটিক ক্লাস করব না? এর কটাক্ষপাত করা যাক:
public class MySpecialStringWriter
{
public void OutputString(string source)
{
ServiceLocator.OutputProvider.Output("This is the string that was passed: " + source);
}
}
এটা অনেক সহজ, তাই না?
ভুল।
ধরা যাক যে আইওআউটপুটপ্রভাইডারটি একটি দীর্ঘ দীর্ঘ ওয়েব সার্ভিস দ্বারা প্রয়োগ করা হয়েছে যা সারা বিশ্ব জুড়ে পনেরোটি পৃথক ডাটাবেসে স্ট্রিং লিখেছে এবং এটি সম্পূর্ণ করতে খুব দীর্ঘ সময় নেয়।
এই ক্লাসটি পরীক্ষা করার চেষ্টা করা যাক। পরীক্ষার জন্য আমাদের আলাদা আলাদা আইওআউটপুটপ্রভাইডার প্রয়োজন। আমরা কীভাবে পরীক্ষা লিখি?
ভাল এটি করার জন্য যখন পরীক্ষার মাধ্যমে ডাকা হয় তখন আইওআউটপুটপ্রাইডারকে আলাদাভাবে প্রয়োগ করতে আমাদের স্ট্যাটিক সার্ভিস লোকেশন শ্রেণিতে কিছু অভিনব কনফিগারেশন করা দরকার। এমনকি সেই বাক্যটি লেখা বেদনাদায়ক ছিল। এটি বাস্তবায়ন করণীয় হবে এবং এটি রক্ষণাবেক্ষণের দুঃস্বপ্ন হবে । পরীক্ষার জন্য আমাদের কখনই কোনও শ্রেণি বিশেষত পরিবর্তন করার দরকার নেই, বিশেষত যদি সেই শ্রেণি না হয় যা আমরা প্রকৃতপক্ষে পরীক্ষার চেষ্টা করি to
সুতরাং এখন আপনি উভয়ের সাথে ক) বাকী রেখে গেছেন) যা একটি সম্পর্কহীন সার্ভিস লোকেশন শ্রেণিতে বিঘ্ন কোড পরিবর্তন ঘটায়; বা খ) কোনও পরীক্ষা নেই। এবং আপনার পাশাপাশি কম নমনীয় সমাধানও রয়েছে।
সুতরাং সেবা লোকেটার বর্গ হয়েছে কন্সট্রাকটর মধ্যে ইনজেকশনের করা হবে। যার অর্থ হ'ল আমরা উল্লিখিত নির্দিষ্ট সমস্যাগুলি রেখে এসেছি। পরিষেবা লোকেটারের আরও কোডের প্রয়োজন, অন্যান্য বিকাশকারীদের বলুন যে এটির মতো জিনিসগুলির প্রয়োজন এটি অন্য বিকাশকারীদের আরও খারাপ কোড লেখার জন্য উত্সাহ দেয় এবং আমাদের এগিয়ে যাওয়ার ক্ষেত্রে কম স্বচ্ছলতা দেয়।
কেবলমাত্র সার্ভিস লোকেটারগুলিতে একটি অ্যাপ্লিকেশনে সংযোগ বাড়ায় এবং অন্যান্য বিকাশকারীদের উচ্চ যুগল কোড লিখতে উত্সাহিত করে ।