एमवीसी + 3 टीयर; जहाँ ViewModels खेलने में आते हैं?


11

मैं ASP.NET MVC 4 का उपयोग करके एक 3-स्तरीय एप्लिकेशन को डिज़ाइन कर रहा हूं। मैंने एक संदर्भ के रूप में निम्नलिखित संसाधनों का उपयोग किया है।

मेरे पास अभी तक निम्नलिखित desingn है।

प्रस्तुति परत (पीएल) (मुख्य एमवीसी परियोजना, जहां एम के एमवीसी को डेटा एक्सेस लेयर में स्थानांतरित किया गया था):

MyProjectName.Main
    Views/
    Controllers/
    ...

व्यापार तर्क परत (BLL) :

MyProjectName.BLL
    ViewModels/
    ProjectServices/
    ...

डेटा एक्सेस लेयर (DAL) :

MyProjectName.DAL
    Models/
    Repositories.EF/
    Repositories.Dapper/
    ...

अब, पीएल संदर्भ बीएलएल और बीएलएल संदर्भ डीएएल। इस तरह से निचली परत ऊपर वाले पर निर्भर नहीं करती है।

इस डिज़ाइन में PL, BLL की एक सेवा को आमंत्रित करता है। पीएल बीएलएल को एक व्यू मॉडल पास कर सकता है और बीएलएल पीएल को एक मॉडल वापस देख सकता है।

इसके अलावा, BLL DAL लेयर को आमंत्रित करता है और DAL लेयर एक मॉडल को BLL में वापस ला सकता है। बीएलएल बदले में एक मॉडल का निर्माण कर सकता है और इसे पीएल में लौटा सकता है।

अब तक यह पैटर्न मेरे लिए काम कर रहा था। हालाँकि, मैं एक समस्या में भाग गया हूँ जहाँ मेरे कुछ ViewModels को कई संस्थाओं पर जुड़ने की आवश्यकता होती है। सादे MVC दृष्टिकोण में, नियंत्रक में मैंने LINQ क्वेरी का उपयोग joins और फिर करने के लिए किया select new MyViewModel(){ ... }। लेकिन अब, DAL में मुझे उस जगह तक पहुँच नहीं है जहाँ ViewModels परिभाषित किया गया है (BLL में)।

इसका मतलब है कि मैं DAL में शामिल नहीं हो सकता और इसे BLL में वापस कर सकता हूं। ऐसा लगता है कि मुझे DAL (एक क्वेरी में जुड़ने के बजाय) में अलग-अलग क्वेश्चन करने होंगे और फिर BLL ViewModel के निर्माण के लिए इनका उपयोग करेगा। यह बहुत असुविधाजनक है, लेकिन मुझे नहीं लगता कि मुझे DAL को ViewModels से उजागर करना चाहिए।

किसी भी विचार मैं कैसे इस दुविधा को हल कर सकते हैं? धन्यवाद।

जवाबों:


18

मुख्य एमवीसी परियोजना, जहां एम के एमवीसी को डेटा एक्सेस लेयर में स्थानांतरित किया गया था

सामान्य गलतफहमी। Mके MVCकई उदाहरण और ट्यूटोरियल तो दावा है कि बावजूद, डेटा के साथ कोई संबंध नहीं है।

M आपका ViewModel है और आपको अपने MVC प्रोजेक्ट में रहना चाहिए। आपके BLL में आपके द्वारा देखे गए ViewModels को वास्तव में DataContracts या BusinessModels नाम दिया जाना है।

आपके नियंत्रक में आपके पास इसके लिए कुछ तुलनीय है:

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

आपकी सेवा में, कुछ इस तरह:

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

और DataAccess में, आप अनुरोध की गई वस्तु के अनुसार उचित जुड़ाव करते हैं। हालाँकि, आवश्यक होने पर आप अपने DataAccess में कस्टम तरीके जोड़ने के लिए स्वतंत्र हैं, इसलिए आपकी सेवा उन विधियों को कॉल कर सकती है:

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.