तो इंटरफ़ेस तस्वीर में कैसे आते हैं?
इस तरह
:
public interface IEmployeeRepository
{
Employee[] GetAll();
}
और फिर आप के रूप में कई कार्यान्वयन के रूप में आप की तरह हो सकता है:
public class EmployeeRepositoryEF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying your EF DbContext
}
}
public class EmployeeRepositoryXML: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying an XML file
}
}
public class EmployeeRepositoryWCF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying some remote WCF service
}
}
and so on ... you could have as many implementation as you like
आप यह वास्तव में महत्वपूर्ण नहीं है कि हम कैसे भंडार को लागू देख सकते हैं।महत्वपूर्ण बात यह है कि सभी भंडार और कार्यान्वयन परिभाषित अनुबंध (इंटरफ़ेस) का सम्मान करते हैं और सभी में GetAll
कर्मचारियों की सूची लौटने की विधि होती है।
और फिर आपके पास एक नियंत्रक होगा जो इस इंटरफ़ेस का उपयोग करता है।
public class EmployeesController: Controller
{
private readonly IEmployeeRepository _repository;
public EmployeesController(IEmployeeRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var employees = _repository.GetAll();
return View(employees);
}
}
देखें कि नियंत्रक अब भंडार के विशिष्ट कार्यान्वयन पर निर्भर करता है या नहीं? यह सब जानने की जरूरत है कि यह कार्यान्वयन अनुबंध का सम्मान करता है। अब आपको जो कुछ करना है, वह है कि आप अपनी पसंदीदा निर्भरता इंजेक्शन ढांचे को कार्यान्वित करने के लिए कॉन्फ़िगर करें।
- स्थापित Ninject.MVC3 NuGet
उत्पन्न ~/App_Start/NinjectWebCommon.cs
कोड आप बस कोड की एक लाइन के साथ एफई कार्यान्वयन उपयोग करने का निर्णय में:
यह इस तरह Ninject साथ किया जाता है, इसका एक उदाहरण
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IEmployeeRepository>().To<EmployeeRepositoryEF>();
}
इस तरह आप नहीं रह गया है की किसी भी मैनुअल instantiations करने की जरूरत है उन भंडार वर्गों और उपवास या जो कुछ भी के बारे में चिंता करते हैं। यह निर्भरता इंजेक्शन ढांचा है जो उन्हें आपके लिए प्रबंधित करता है और नियंत्रक कन्स्ट्रक्टर में परिभाषित कार्यान्वयन को इंजेक्शन देने का ख्याल रखता है।
और इस कॉन्फ़िगरेशन को संशोधित करके आप अपने नियंत्रक में कोड की एक पंक्ति को छूए बिना अपनी डेटा एक्सेस तकनीक स्विच कर सकते हैं। इस तरह अलगाव में यूनिट परीक्षण भी खेल में आता है। चूंकि आपका कंट्रोलर कोड अब कमजोर रूप से भंडार के साथ मिलकर है (हमने जो इंटरफेस पेश किया है, उसके लिए धन्यवाद) आपको यूनिट टेस्ट में करने की ज़रूरत है, जो कि भंडार पर कुछ नकली कार्यान्वयन प्रदान करना है जो आपको इसके व्यवहार को परिभाषित करने की अनुमति देता है। यह आपको किसी डेटाबेस या जो कुछ भी निर्भरता के बिना इंडेक्स नियंत्रक कार्रवाई का परीक्षण करने की संभावना देता है। पूर्ण अलगाव
मैं आपको एएसपी.नेट एमवीसी में टीडीडी और डी के बारे में following articles चेकआउट करने के लिए भी आमंत्रित करता हूं।
स्रोत
2012-05-16 09:57:49
अद्भुत उत्तर, प्रत्येक स्पष्टीकरण योग्य है .. अब मुझे यह पता चलता है कि चीजें कैसे काम करती हैं .. धन्यवाद, मैं इस उत्तर को स्वीकार नहीं कर सकता क्योंकि मेरे अंक 15 से नीचे हैं, जैसे ही मैं कमाता हूं, मैं इसे उत्तर के रूप में स्वीकार करूंगा। – Meson
उस लेख के लिए धन्यवाद .. और मान लीजिए कि अगर मैं अपने निर्भरता इंजेक्शन ढांचे में 'कर्मचारी रिपोजिटरीईएफ' को कॉन्फ़िगर करता हूं, तो मेरा नियंत्रक इस 'कर्मचारी रिपोजिटरीएफ़' का उपभोग करेगा, लेकिन अगर मैं उसी नियंत्रक में 2 कार्यान्वयन का उपभोग करना चाहता हूं .. यदि यह प्रश्न बेवकूफ im बहुत खेद है .. – Meson
उदाहरण में मैं प्रदाता नियंत्रक को अपने कंस्ट्रक्टर में 'आईएमएमबीआई रिपोजिटरी' उदाहरण की अपेक्षा करता है। केवल एक ही कार्यान्वयन पारित किया जा सकता है। दूसरी ओर आप एक और नियंत्रक हो सकता है जिसे इंटरफ़ेस के एक अलग कार्यान्वयन की आवश्यकता हो सकती है। यह पूरी तरह से संभव है। आपको बस अपने डी ढांचे को कॉन्फ़िगर करने की आवश्यकता है ताकि यह नियंत्रक ए में कार्यान्वयन ए और नियंत्रक बी में कार्यान्वयन बी को इंजेक्ट करे। सिंटैक्स निश्चित रूप से विभिन्न डी ढांचे के बीच भिन्न होगा। –