हालांकि यह एक सामान्य प्रश्न है, यह एक ऐसी समस्या के लिए भी विशिष्ट है जो मैं वर्तमान में अनुभव कर रहा हूं। वर्तमान में मेरे पास मेरे समाधान में निर्दिष्ट एक इंटरफ़ेस है
public interface IContextProvider
{
IDataContext { get; set; }
IAreaContext { get; set; }
}
इस इंटरफ़ेस का उपयोग अक्सर पूरे कार्यक्रम में किया जाता है और इसलिए मुझे उन वस्तुओं तक आसानी से पहुंच प्राप्त होती है जिनकी मुझे आवश्यकता होती है। हालांकि मेरे कार्यक्रम के एक हिस्से के काफी निचले स्तर पर मुझे किसी अन्य वर्ग तक पहुंच की आवश्यकता है जो IAreaContext का उपयोग करेगा और इसके कुछ संचालन करेगा। इसलिए मैंने इस निर्माण को करने के लिए एक और कारखाना इंटरफ़ेस बनाया है जिसे कहा जाता है:
public interface IEventContextFactory
{
IEventContext CreateEventContext(int eventId);
}
मेरे पास एक वर्ग है जो IContextProvider को लागू करता है और NinJect का उपयोग करके इंजेक्ट किया जाता है। मेरे पास समस्या यह है कि जिस क्षेत्र में मुझे इस IEventContextFactory का उपयोग करने की आवश्यकता है, वह केवल IContextProvider तक पहुंचता है और स्वयं एक अन्य वर्ग का उपयोग करता है जिसे इस नए इंटरफ़ेस की आवश्यकता होगी। मैं करने के लिए नहीं करना चाहते हैं का दृष्टांत के इस कार्यान्वयन IEventContextFactory और निम्न स्तर पर नहीं बल्कि होगा साथ काम IEventContextFactory भर इंटरफ़ेस। हालाँकि मैं यह भी नहीं चाहता कि निर्माणकर्ताओं के माध्यम से किसी अन्य पैरामीटर को इंजेक्ट किया जाए, क्योंकि यह उस कक्षा से होकर गुजरे जिसकी आवश्यकता है
// example of problem
public class MyClass
{
public MyClass(IContextProvider context, IEventContextFactory event)
{
_context = context;
_event = event;
}
public void DoSomething()
{
// the only place _event is used in the class is to pass it through
var myClass = new MyChildClass(_event);
myClass.PerformCalculation();
}
}
तो मेरा मुख्य प्रश्न यह है कि क्या यह स्वीकार्य होगा या क्या ऐसा कुछ करना सामान्य या अच्छा अभ्यास है (इंटरफ़ेस किसी अन्य इंटरफ़ेस का विस्तार करें):
public interface IContextProvider : IEventContextFactory
या मुझे जो चाहिए उसे प्राप्त करने के लिए बेहतर विकल्पों पर विचार करना चाहिए। अगर मैंने सुझाव देने के लिए पर्याप्त जानकारी नहीं दी है तो मुझे बताएं और मैं और जानकारी प्रदान कर सकता हूं।