ठीक है, मुझे लगता है कि आपका प्रश्न है, कैसे एमवीसी अनुप्रयोग में "परतें" आर्किटेक्ट करने के लिए। इस सरल वास्तुकला पर एक नज़र डालें, मैं इसे अपने एमवीसी ऐप्स के लिए उपयोग करता हूं और यह साफ और कुशल प्रतीत होता है।
समाधान में परियोजना - व्यापार मॉडल - व्यवसाय डोमेन का प्रतिनिधित्व करने वाले पीओसीओ वर्गों से भरा सरल वर्ग पुस्तकालय। आप यहां डेटा एनोटेशन का उपयोग कर सकते हैं, सत्यापन तर्क के लिए मेटाडेटा कक्षाएं, आदि
प्रोजेक्ट - ईएफ-आधारित रिपॉजिटरीज़ - एक और सरल वर्ग लाइब्रेरी; यहां परिभाषित संदर्भ है (ईएफ कोड पहले महान है, लेकिन आप पहले ईएफ डेटाबेस का उपयोग कर सकते हैं या पहले मॉडल का उपयोग कर सकते हैं - आपको बस बिजनेस मॉडल क्लास लाइब्रेरी में कोई भी बड़ा सौदा नहीं है), और कक्षाओं का सेट - रिपॉजिटरीज
प्रोजेक्ट - मैं आमतौर पर इसे "सर्विसलेयर" कहता हूं या इसलिए (मैं बेहतर नाम के लिए सुझाव के लिए खुला हूं :) - इसमें केवल इंटरफेस हैं, रिपॉजिटरीज और अन्य सेवाओं के लिए (अलग-अलग परियोजनाओं में लागू) जो मेरी एमवीसी (या कोई अन्य तकनीक)) आधारित आवेदन उपयोग; 2.प्रोजेक्ट से रिपोजिटरीज इन इंटरफेस को लागू करें
प्रोजेक्ट - एमवीसी वेबसाइट। यह रिपोजिटरी मैपिंग (और अन्य सेवाओं) के लिए निर्भरता इंजेक्शन (निर्भरता रेसोलवर में निर्मित, और मुझे निंजा कंटेनर का उपयोग करना पसंद है) का उपयोग करता है; तो फिर तुम नियंत्रकों में निर्माता इंजेक्शन का उपयोग कर सकते हैं, या कुछ "सुस्त" दृष्टिकोण (नीचे देखें)
यह इस तरह दिखता है:
स्किनी नियंत्रक:
public class SomethingController : BaseController
{
public ActionResult DoSomething(SomeBusinessThing input)
{
if (ModelState.IsValid)
{
var result = CustomerRepository.DoSomeBusinessLogicAndPersistenceAndStuff(input);
return View(result); // you can use AutoMapper here, if you dont want to use business object as viewmodels
}
}
}
मेरे भंडार "संपत्ति "मेरे बेसकंट्रोलर से विरासत में मिला है:
public class BaseController : Controller
{
// ... other stuff used by all (or multiple) controllers
private ICustomerRepository _customerRepository;
protected ICustomerRepository CustomerRepository
{
get
{
if (_customerRepository== null)
_customerRepository= DependencyResolver.Current.GetService();
return _customerRepository;
}
}
}
यदि आप अपने" आलसी "DI का उपयोग कर सकते हैं तो नियंत्रक कई सेवाओं का उपयोग करता है, लेकिन केवल 1-2 प्रति क्रिया है, इसलिए यह सभी को कन्स्ट्रक्टर के साथ इंजेक्ट करने के लिए अक्षम होगा।कोई आपको बता सकता है कि आप इस तरह निर्भरता "छुपा" कर रहे हैं, लेकिन यदि आप इन सभी चीजों को एक ही स्थान पर रखते हैं - बेसकंट्रोलर, इसका कोई बड़ा सौदा नहीं है।
ठीक है, भंडार का कार्यान्वयन वास्तव में आपका व्यवसाय है। MVC आवेदन न भी आप एफई उपयोग कर रहे हैं पता है, यह सेवाओं की केवल इंटरफेस जानता है और कार्यान्वयन underlaying के बारे में देखभाल नहीं करता
Conslusion (जो आप बाद में कभी भी अगर आप की जरूरत है स्विच कर सकते हैं!):
नियंत्रकों पतला कर रहे हैं - कोई व्यापार तर्क
मॉडल फैट है - और इस मामले में, खजाने सभी व्यापार तर्क को संपुटित (क्या आप वाकई सेवाओं के अन्य प्रकार के रूप में अच्छी तरह से उदाहरण के लिए कुछ कैलकुलेटर आदि के प्रसंस्करण के लिए उपयोग कर सकते हैं, तो याद रखें , एमवीसी परवाह नहीं है, ओएनएल जानता है y इंटरफेस)
ViewModels दृश्य के लिए इनपुट कर रहे हैं (और ViewModel आपके व्यवसाय मॉडल सीधे हो सकता है, या आप "शुद्ध" ViewModels) बनाने के लिए AutoMapper उपयोग कर सकते हैं
यह .NET अनुप्रयोगों के लिए आर्किटेक्चर पर एक अच्छा पठन है और एमवीसी पर एक अनुभाग है: http://www.amazon.com/Microsoft%C2%AE-NET-Architecting- अनुप्रयोग-प्रो- डेवलपर/डीपी/07356260 9एक्स –