আমার কাছে একটি ইন্টারফেস রয়েছে IContext
। এর উদ্দেশ্যগুলির জন্য এটি নীচে ব্যতীত এটি যা করে তা সত্যিই আসে না:
T GetService<T>();
এই পদ্ধতিটি যা করে তা হ'ল অ্যাপ্লিকেশনের বর্তমান ডিআই কনটেইনারের দিকে নজর দেওয়া এবং নির্ভরতা সমাধানের চেষ্টা করা। মোটামুটি স্ট্যান্ডার্ড আমি মনে করি।
আমার এএসপি.এনইটি এমভিসি অ্যাপ্লিকেশনটিতে, আমার নির্মাতাকে এটির মতো দেখাচ্ছে।
protected MyControllerBase(IContext ctx)
{
TheContext = ctx;
SomeService = ctx.GetService<ISomeService>();
AnotherService = ctx.GetService<IAnotherService>();
}
সুতরাং প্রতিটি পরিষেবার জন্য কনস্ট্রাক্টরে একাধিক পরামিতি যুক্ত করার পরিবর্তে (কারণ এটি বিকাশকারীদের অ্যাপ্লিকেশনটি প্রসারিত করার জন্য সত্যই বিরক্তিকর এবং সময় সাপেক্ষ হবে) আমি পরিষেবাগুলি পেতে এই পদ্ধতিটি ব্যবহার করছি।
এখন, এটি ভুল মনে হচ্ছে । যাইহোক, আমি বর্তমানে এটি আমার মাথায় যেভাবে ন্যায়সঙ্গত করছি তা হ'ল - আমি এটি উপহাস করতে পারি ।
আমি পারি. IContext
কন্ট্রোলার পরীক্ষা করার জন্য উপহাস করা কঠিন হবে না । আমার যাই হোক:
public class MyMockContext : IContext
{
public T GetService<T>()
{
if (typeof(T) == typeof(ISomeService))
{
// return another mock, or concrete etc etc
}
// etc etc
}
}
তবে আমি যেমন বলেছি, এটি ভুল বলে মনে হচ্ছে। কোন চিন্তা / আপত্তিজনক স্বাগত।
public SomeClass(Context c)
। এই কোডটি বেশ পরিষ্কার, তাই না? এটিতে বলা আছে, that SomeClass
ক এর উপর নির্ভর করে Context
। এরর, কিন্তু অপেক্ষা করুন, এটি না! এটি কেবল X
প্রসঙ্গ থেকে প্রাপ্ত নির্ভরতার উপর নির্ভর করে । এর মানে হল যে, প্রত্যেক সময় আপনাকে পরিবর্তন করতে Context
এটা পারে বিরতি SomeObject
, যদিও আপনি শুধুমাত্র পরিবর্তিত Context
গুলি Y
। তবে হ্যাঁ, আপনি জানেন যে আপনি কেবল পরিবর্তন করেন Y
নি X
, তাই SomeClass
ঠিক। তবে ভাল কোড লেখার বিষয়টি আপনি যা জানেন তা নয় তবে নতুন কর্মী যখন প্রথমবার আপনার কোডটি দেখবে তখন কী জানে about