मेरे पास एक इंटरफ़ेस है IContext
। इसके उद्देश्यों के लिए यह वास्तव में मायने नहीं रखता कि यह निम्नलिखित को छोड़कर क्या करता है:
T GetService<T>();
यह विधि क्या करती है आवेदन के वर्तमान डीआई कंटेनर को देखें और निर्भरता को हल करने का प्रयास करें। काफी हद तक मानक मुझे लगता है।
ASP.NET MVC एप्लिकेशन में, मेरा निर्माता इस तरह दिखता है।
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
यह ठीक है। लेकिन अच्छा कोड लिखना इस बात के बारे में नहीं है कि आप क्या जानते हैं बल्कि नया कर्मचारी क्या जानता है जब वह पहली बार आपके कोड को देखता है।