2010-09-04 26 views
9
public interface ITaskProvider 
{ 
    T GetTask<T>(); 
} 

नीचे ITaskprovider के कार्यान्वयन में, आप देख के रूप में IUserTask और IIdentityTask के बजाय संपत्ति निर्माता से इंजेक्शन की जा रही है। कारण यह है कि विंडसर स्वचालित रूप से इंजेक्शन गुणों को को रनटाइम पर तुरंत चलाता है ताकि मुझे सभी इंजेक्शन निर्भरताओं को कन्स्ट्रक्टर में रखना न पड़े।निर्भरता इंजेक्शन

public class TaskProvider : ITaskProvider 
    { 
     public IUserTasks UserTasks { get; set; } 

     public IIdentityTasks IdentityTasks { get; set; } 

     public T GetTask<T>() 
     { 
      Type type = typeof(T); 
      if (type == typeof(IUserTasks)) return (T)this.UserTasks; 
      if (type == typeof(IIdentityTasks)) return (T)this.IdentityTasks; 

      return default(T); 
     } 
    } 

नियंत्रक में मैं कन्स्ट्रक्टर में आईटास्कप्रोवाइडर इंजेक्शन कर रहा हूं।

public ITaskProvider TaskProvider { get; set; } 

public AuctionsController(ITaskProvider taskProvider) 
     { 
      TaskProvider = taskProvider; 
     } 

और यहां मैं टास्कप्रोवाइडर और इसकी विधियों को ठीक कहता हूं।

public ActionResult Index() 
{ 
var userTasks = TaskProvider.GetTask<IUserTasks>(); 
var user = userTasks.FindbyId(guid); 

} 

यहां तक ​​कि सब कुछ ठीक काम करता है।

मुझे बताया गया है कि यह एक सेवा लोकेटर पैटर्न की तरह है और निर्भरता इंजेक्शन पैटर्न का उल्लंघन कर रहा है और मैं जानना चाहता हूं कि यहां क्या उल्लंघन हो रहा है।

उत्तर

4

मेरे लिए, अपने कोड में डि खिलाफ कोई उल्लंघन, wikipedia के बारे में नहीं है कुछ मामलों में आप का उल्लंघन हो सकता है (यदि आप नहीं कार्यक्रमों सावधानी से करना) Law Of Demeter

अपने कोड पर एक नज़र डालें:

public ActionResult Index() 
{ 
var userTasks = TaskProvider.GetTask<IUserTasks>(); 
var user = userTasks.FindbyId(guid); 
} 
+0

इस उपयोगी सामान के लिए धन्यवाद। – Murat

2

यदि नियंत्रक को IUserTasks उदाहरण की आवश्यकता है, तो यह आसान होगा अगर इसे सीधे कंटेनर से प्राप्त किया जाए। अनिवार्य रूप से, TaskProvider कंटेनर के आस-पास एक रैपर है, वैसे भी, जहां यह UserTasks और IdentityTasks उदाहरण प्राप्त करता है।

+0

हाँ यह सिर्फ एक रैपर है।क्या यह अभी भी निर्भरता इंजेक्शन पैटर्न का उल्लंघन कर रहा है? – Murat

+1

@ मुरत - यह वास्तव में उल्लंघन नहीं है अगर इसे अपने आश्रितों में इंजेक्शन दिया जाता है, तो यह कोई मूल्य प्रदान नहीं करता है। – Lee

2

आप IUserTasks और IIdentityTasks के कार्यान्वयन को इंजेक्शन देने के बजाए नियंत्रक में प्रभावी रूप से "सेवा लोकेटर" को इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग कर रहे हैं।

आपका वास्तविक नियंत्रक वास्तव में IUserTasks और IIdentityTasks पर निर्भरता है, लेकिन आप सीधे जिसमें इंजेक्शन नहीं कर रहे हैं अपने नियंत्रक में उन के बजाय "सेवा लोकेटर" या टास्क प्रदाता का उपयोग करने के लिए निर्णय लेने और इसलिए आप सेवा लोकेटर पर निर्भरता इंजेक्शन है उदाहरण ऐसा कुछ भी प्रदान नहीं करता है जो सीधे वास्तविक निर्भरताओं को इंजेक्ट करके किया जा सके।

1

आपको IUserTask और IIdentityTask को नियंत्रक के कन्स्ट्रक्टर में इंजेक्ट करना चाहिए, क्योंकि टास्कप्रोवाइडर का उपयोग करने में कोई लाभ नहीं है। इसके अलावा, जिस तरह से आपने इसे किया, आप कुछ संकलन समय जांच याद करते हैं। उदाहरण के लिए, आप TaskProvider.GetTask() को कॉल कर सकते हैं और रनटाइम पर विस्फोट करने का इंतजार कर सकते हैं। कम से कम, उस सामान्य पैरामीटर पर कुछ बाधा डालना चाहिए (यदि दोनों इंटरफेस दोनों सामान्य माता-पिता से उत्तराधिकारी हैं)।

"उल्लंघन" के संबंध में, आपको ध्यान रखना चाहिए कि आप नियंत्रक में निर्भरता इंजेक्शन नहीं दे रहे हैं। आप उन्हें पुनः प्राप्त करने का एक तरीका प्रदान कर रहे हैं। निर्भरता संकल्प

से अलग व्यवहार करने के लिए

कोर प्रिंसिपल लेकिन बुरी पक्ष अपने नियंत्रक बहुत अधिक ज्ञान है:

संबंधित मुद्दे