2012-02-25 18 views
22

मैंने देखा है कि बहुत से डेवलपर प्रत्येक कक्षा के लिए इंटरफ़ेस को परिभाषित करते हैं जिसे DI ढांचे का उपयोग करके इंजेक्शन दिया जा रहा है। प्रत्येक वर्ग के लिए इंटरफेस को परिभाषित करने के क्या फायदे हैं?निर्भरता इंजेक्शन और इंटरफेस का उपयोग कर?

+4

क्यों बंद करें? समय लेने और टिप्पणी छोड़ने के बारे में कैसे? – aryaxt

+0

-1 एफएक्यू अंक देखें "मैं यहां किस तरह के प्रश्न पूछ सकता हूं?" और "मुझे यहां कौन से प्रश्न नहीं पूछना चाहिए"। वे सूची में पहले दो हैं। –

+1

आपका प्रश्न वैध और रोचक प्रश्न है, लेकिन यह थोड़ा अस्पष्ट है और बहुत विशिष्ट नहीं है (उदाहरण के लिए कोई कोड उदाहरण नहीं), यही कारण है कि लोगों ने इसे कम किया और इसे बंद करने के लिए वोट दिया। – Steven

उत्तर

16

दे अपने एप्लिकेशन घटकों (वर्गों है कि आवेदन तर्क शामिल) को लागू एक अंतरफलक महत्वपूर्ण है, के बाद से इस की अवधारणा को बढ़ावा दिया: एक अंतरफलक, नहीं एक कार्यान्वयन के लिए

कार्यक्रम।

यह प्रभावी रूप से Dependency Inversion Principle है। ऐसा करने से आप इस निर्भरता के उपभोक्ताओं को बदलने की आवश्यकता के बिना निर्भरताओं को प्रतिस्थापित, अवरुद्ध या सजाने की अनुमति देते हैं।

कई मामलों में डेवलपर्स SOLID सिद्धांतों का उल्लंघन करेंगे, हालांकि कक्षाओं और इंटरफेस के बीच लगभग एक-से-एक मैपिंग होने पर। उन सिद्धांतों में से एक जो लगभग निश्चित रूप से उल्लंघन किया गया है Open/closed principle है, क्योंकि जब प्रत्येक वर्ग का अपना इंटरफ़ेस होता है, तो क्रॉस-कटिंग चिंताओं के साथ कक्षाओं के एक समूह को विस्तारित (सजाने) संभव नहीं है (गतिशील प्रॉक्सी पीढ़ी की चाल के बिना)।

सिस्टम लिखने में, मैं दो जेनेरिक इंटरफेस को परिभाषित करता हूं जो व्यापार परत के कोड के बड़े हिस्से को कवर करते हैं। वे ICommandHandler<TCommand> और कहा जाता है एक IQueryHandler<TQuery, TResult>:

public interface ICommandHandler<TCommand> 
{ 
    void Handle(TCommand command); 
} 

public interface IQueryHandler<TQuery, TResult> where TQuery : IQuery<TResult> 
{ 
    TResult Handle(TQuery query); 
} 

कई इंटरफेस को परिभाषित करने के न होने का अच्छा पक्ष प्रभाव के अलावा, इस महान लचीलापन और परीक्षण में आसानी अनुमति देता है। आप इसके बारे में here और here के बारे में अधिक पढ़ सकते हैं।

प्रणाली मैं लिखने के आधार पर, मैं भी इस तरह के रूप इंटरफेस का उपयोग हो सकता है:

  • IValidator<T> संदेशों
  • ISecurityValidator<T> मान्य संदेशों
  • IRepository<T>, भंडार तर्ज पर सुरक्षा प्रतिबंधों को लागू करने के लिए के लिए
  • IQueryable<T> प्रश्नों पर प्राधिकरण/सुरक्षा फ़िल्टरिंग लागू करने के लिए IAuthorizationFilter<T>

मैं लिखने वाली प्रणाली के आधार पर, सभी घटकों के 80% और 98% प्रोसेस के बीच कहीं भी इन सामान्य इंटरफेस को परिभाषित करता हूं। यह उन लोगों को क्रॉस-कटिंग चिंताओं को लागू करता है जिन्हें joinpoints तुच्छ माना जाता है।

2

इस ब्लॉग प्रविष्टि जवाब आप के लिए देख रहे हैं की एक बहुत कुछ है: http://benpryor.com/blog/2006/08/23/java-advantages-of-interfaces/

आप इंटरफेस के डिजाइन नहीं है, तो आप पंगु होने के लिए जब वह अपने कोड refactor करने के लिए और/या समय आता जा रहे हैं वृद्धि जोड़ें। एक इंटरफ़ेस को डिज़ाइन करने की बात आती है जब एक डी फ्रेमवर्क का उपयोग वास्तव में समस्या पर नहीं है। क्या DI आपको देर से बाध्यकारी और इकाई परीक्षण लिखने की बेहतर क्षमता देता है।

+0

यह कहता है कि पेज नहीं मिला। कृपया अद्यतन करें –

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