जावास्क्रिप्ट प्रतिरूपकता, सर्वर आधारित MVC और व्यावसायिक वास्तविकता


32

मैं समझता हूं कि यह एक बहुत व्यापक प्रश्न है, लेकिन मैंने व्यक्तिगत रूप से इस समस्या के विभिन्न पहलुओं के साथ काम किया है और सभी अवधारणाओं और प्रौद्योगिकियों को एक साथ लाने के लिए संघर्ष कर रहा हूं।

मैं यह बताना चाहूंगा कि इन तकनीकों में उत्तर शामिल होने चाहिए:

  • सी#
  • MVC 3 w / रेज़र
  • जावास्क्रिप्ट w / jQuery

यदि वे इस प्रश्न का उत्तर देने में सहायता करते हैं, तो (और बैकबोन.जैस , एंटिटी फ्रेमवर्क इत्यादि जैसे) उन से ऊपर और उससे परे कुछ भी स्वागत करते हैं:

उपरोक्त सूचीबद्ध तकनीकों का उपयोग करते हुए, स्केलेबिलिटी बनाए रखने के लिए कोड और तर्क को व्यवस्थित करने के लिए एक इष्टतम रणनीति क्या है और एक अमीर, तेज, स्वच्छ UI बनाने की क्षमता है?

आदर्श रूप से ध्यान एक व्यवसाय / कॉर्पोरेट वातावरण में तैनात किए जा रहे समाधान पर रखा जाना चाहिए। उस नोट पर, ऊपर दी गई तकनीकों की सूची को नहीं बदला जाएगा, इसलिए कृपया समाधानों की पेशकश न करें कि "आपको yyy के बजाय xxx का उपयोग करना चाहिए जिसे आप अभी उपयोग कर रहे हैं"।

पृष्ठभूमि

मैं हर रोज jQuery के साथ काम करता हूं, ASP.NET के MVC को अपनाया है और लंबे समय से C # के साथ काम कर रहा हूं। तो आप उन प्रौद्योगिकियों के मध्यवर्ती-से-उन्नत ज्ञान मानकर समाधान प्रस्तुत कर सकते हैं।

मैं प्रश्न को छोटे भागों में व्यवस्थित करूँगा ताकि इसका उत्तर देना सरल हो जाए:

1. परियोजना की संरचना

यह देखते हुए कि मैं ASP.NET MVC ( विजुअल स्टूडियो 2010 में ) के साथ काम कर रहा हूं, मैं एक डायरेक्टरी स्ट्रक्चर सॉल्यूशन चाहूंगा जो इस तरह के एप्लिकेशन को मुख्य लेआउट की कुछ स्वीकृति प्रदान करता है। ब्रंच जैसा कुछ मुझे लगता है, लेकिन प्रत्येक फ़ोल्डर में क्या होगा और ऐप के अन्य क्षेत्रों के साथ यह कैसे काम करता है, इसके बारे में थोड़ा और विस्तार के साथ।

2. डेटा का उपयोग

मैं एपीआई-प्रकार की संरचना के साथ अपने डेटा एक्सेस को जितना संभव हो उतना संशोधित करना चाहता हूं। आप POCO वस्तुओं (के बहुत सारे मान सकते हैं User, UserGroup, Customer, OrderHeader, OrderDetails, आदि), लेकिन वहाँ भी कुछ जटिल रिपोर्ट है कि डेटा गहन एसक्यूएल और सावधान यूआई प्रतिपादन की आवश्यकता होगी। EF + LINQ पूर्व के लिए शानदार है लेकिन बाद के लिए इतना नहीं है। मुझे ऐसा कुछ नहीं मिल रहा है जो अत्यधिक जटिल या अत्यधिक सरल होने के बिना दोनों परिदृश्यों को फिट करने के लिए लगता है।

3. क्लाइंट-साइड कोड संगठन और यूआई रेंडरिंग

सबसे पहले jQuery लेने वाले अधिकांश डेवलपर्स की तरह, मैं जहाँ भी जाने की आवश्यकता थी, वहां कोड को एक साथ मिलाने के जाल में गिर गया, लेकिन जल्दी ही पाया गया कि यह ऊपर की ओर जमा है और बदसूरत है। हालाँकि मुझे तब से छलांग और सीमाएं आती हैं, फिर भी मैं अपने कोड को संशोधित करने और यूआई के विभिन्न हिस्सों के साथ कोड को दोहराए बिना काम करता हूं।

एक उदाहरण के रूप में, कोड का एक विशिष्ट टुकड़ा जो मैं लिख सकता हूं वह इस तरह दिखेगा, मैंने उस सामान पर टिप्पणी की है जो मुझे परेशान करता है ( ध्यान दें कि मैंने तब से स्थगित AJAX कॉल का उपयोग करने के लिए बदल दिया है और वास्तविक डेटा अनुरोधों को DOM हेरफेर से अलग कर दिया है ):

$('#doSomethingDangerous').click(function () {
    // maybe confirm something first
    if (confirm('Are you sure you want to do this?')) {   

        // show a spinner?  something global would be preferred so I don't have to repeat this on every page 
        $('#loading').show();  

        // maybe the page should notify the user of what's going on in addition to the dialog?
        $('#results').show().html('<h2>Please wait, this may take a while...</h2>');  

        $.ajax({
            url: 'blah/DoDangerousThing',
            success: function (data) {                     
                // The results will be loaded to the DOM obviously, is there a better way to pull this type of specific code out of the data access calls?
                $('#results').empty();
                $('#results').append('<b>' + data.length + '</b> users were affected by this dangerous activity');
                $('#results').append('<ul>');

                // I've recently started to use jQuery templates for this sort of logic, is that the way to go?
                $(data).each(function (i, user) {
                    $('#results').append('<li>' + user.Username + '</li>');
                });                    
                $('#results').append('</ul>');

                // Need to hide the spinner, again would prefer to have this done elsewhere
                $('#loading').hide();
            }
        });
    }
});

सामान्य सवाल

  • क्लाइंट MVC बनाम सर्वर MVC? मेरी परियोजना पहले से ही एक सर्वर-साइड MVC संरचना है, इसलिए अभी भी ग्राहक MVC की आवश्यकता है जैसे Backbone.js प्रदान करता है?
  • क्या प्रत्येक वस्तु (जैसे OrderHeader.js) के लिए जावास्क्रिप्ट फाइल बनाई जानी चाहिए और फिर निर्माण के दौरान उसे छोटा / विलय कर दिया जाना चाहिए ? या वहाँ होना चाहिए Order.jsजो एक तर्क के लिए OrderHeader, OrderDetails, Reportsआदि है?
  • जटिल प्रश्नों को कैसे संभाला जाना चाहिए? अभी मेरा प्रमुख सिद्धांत /Reports/Orders-By-Date/उन पंक्तियों के साथ या कुछ है और मैं कस्टम SQL क्वेरी का उपयोग करता हूं ViewModelजो रेजर व्यू के लिए एक कस्टम डेटासेट (या ) प्रदान करता है। लेकिन पेजिंग, सॉर्टिंग, आदि के बारे में क्या? क्या क्लाइंट या सर्वर साइड होना बेहतर है? (बड़े डेटासेट मान लें - 2 से 3 सेकंड SQL क्वेरी)
  • मैंने Microsoft के प्रोजेक्ट सिल्क के माध्यम से पढ़ा है । क्या यह जाने का एक अच्छा तरीका है? यह कैसे Backbone.js या अन्य की तुलना करता है?
  • मैं एक एन-टियर आर्किटेक्चर का बहुत आदी हूं, क्या ये अवधारणाएं कुछ हद तक खिड़की से बाहर फेंकती हैं? ऐसा लगता है कि एमवीसी मिनी एन-टियर वर्गों के एक समूह की तरह है जो अतीत में फ्रंट-एंड या टॉप टियर रहा होगा।

फिर से और अधिक विशिष्ट अपने जवाब बेहतर वे हो जाएगा रहे हैं। मैंने उच्च स्तरीय प्रलेखन और उदाहरणों को बहुत पढ़ा है , मैं इसे वास्तविक दुनिया के उदाहरणों में अनुवाद करने के लिए बेहतर समझने की कोशिश कर रहा हूं ।


2
आपने इस सवाल पर बहुत प्रयास किया, लेकिन यह मेरे लिए एक Stackoverflow प्रश्न की तरह नहीं लगता है। शायद प्रोग्रामर स्टैकएक्सचेंज एक बेहतर फिट होगा।
प्वांइट

3
मैं इस बात से असहमत नहीं हूं कि यह एक दिलचस्प विषय है, लेकिन स्टैकओवरफ़्लो को वस्तुनिष्ठ प्रश्नों के बारे में माना जाता है । यह प्रश्न कुछ इस तरह है कि मूल रूप से प्रश्नों के लिए पोस्टर बच्चा है, जो "संभावित राय, बहस, तर्क, मतदान, या चर्चा पर चर्चा करेगा।"
प्वाईंट

8
ऐसे लोगों का एक शिविर है जो हर समय सबसे बड़े पैमाने पर योजना बनाते हैं, जबकि मैं चुपचाप अपना व्यवसाय निकाल लेता हूं क्योंकि उन्होंने किसी ऐसी चीज के लिए बहुत लंबी योजना बनाई जो कभी नहीं हुई।
जेसन सेब्रिंग

1
मैं @ पॉइंट से सहमत हूं कि यह प्रोग्रामर्स स्टैक पर आधारित है। आपका प्रश्न बहुत दिलचस्प है, और मैं इसे फॉलो करूंगा क्योंकि मैं हमेशा सलाह की तलाश में हूं। लेकिन यह एक वस्तुनिष्ठ प्रश्न नहीं है, और केवल तरजीही बहस में समाप्त हो रहा है। हमेशा की तरह, अपनी स्थिति के लिए सबसे अच्छा काम करता है ... हम में से कोई भी आपके नेटवर्क संरचना, ग्राहकों की संख्या या ट्रैफ़िक आँकड़े या निर्माण प्रक्रिया के बारे में कुछ भी नहीं जानता है ... तो सवाल यह है कि बहुत अस्पष्ट है ... मुझे पता है सिल्क से बचें। ;)
one.beat.consumer

1
यह प्रश्न "अत्यधिक विस्तृत" की परिभाषा पर निर्भर करता है और इसलिए "वास्तविक प्रश्न नहीं है"। यदि कुछ भी हो, तो व्यक्तिगत प्रश्नों को कुछ मामूली पृष्ठभूमि के साथ व्यक्तिगत प्रश्नों के रूप में पूछा जाना चाहिए (बहुत अधिक और लोग इसे "वास्तविक प्रश्न नहीं" कहेंगे)। हालाँकि, सावधान रहें, आपके द्वारा पूछे जा रहे व्यक्तिगत प्रश्नों में से कई को शायद अपने आप ही "रचनात्मक नहीं" के रूप में चिह्नित किया जाएगा, इसलिए मैं सावधान रहूंगा कि आप उन प्रश्नों को कैसे पूछते हैं।
कैस्परऑन

जवाबों:


10

टेरी मेरे दोस्त, तुम और मुझे एक ड्रिंक चाहिए। हमारी कुछ ऐसी ही समस्याएं हैं।

1. प्रोजेक्ट संरचना: मैं एडुआर्डो से सहमत हूं कि एमवीसी ऐप में फ़ोल्डर संरचना वांछित होने के लिए कुछ छोड़ देता है। आपके पास अपने मानक नियंत्रक, मॉडल और दृश्य फ़ोल्डर हैं। लेकिन तब व्यू फ़ोल्डर प्रत्येक नियंत्रक, और एक साझा फ़ोल्डर के लिए एक अलग फ़ोल्डर में टूट जाता है। और प्रत्येक दृश्य / नियंत्रकनाम या दृश्य / साझा को EditorTemplates और DisplayTemplates में तोड़ा जा सकता है। लेकिन यह आपको अपने मॉडल फ़ोल्डर को व्यवस्थित करने का निर्णय लेने देता है (आप सबफ़ोल्डर्स और अतिरिक्त नेमस्पेस घोषणाओं के साथ या बिना कर सकते हैं)।

भगवान न करें कि आप ऐसे क्षेत्रों का उपयोग कर रहे हैं, जो प्रत्येक क्षेत्र के नियंत्रक, मॉडल और दृश्य फ़ोल्डर संरचना की नकल करते हैं।

/Areas
    /Area1Name
        /Controllers
            FirstController.cs
            SecondController.cs
            ThirdController.cs
        /Models
            (can organize all in here or in separate folders / namespaces)
        /Views
            /First
                /DisplayTemplates
                    WidgetAbc.cshtml <-- to be used by views in Views/First
                /EditorTemplates
                    WidgetAbc.cshtml <-- to be used by views in Views/First
                PartialViewAbc.cshtml <-- to be used by FirstController
            /Second
                PartialViewDef.cshtml <-- to be used by SecondController
            /Third
                PartialViewMno.cshtml <-- to be used by ThirdController
            /Shared
                /DisplayTemplates
                    WidgetXyz.cshtml <-- to be used by any view in Area1
                /EditorTemplates
                    WidgetXyz.cshtml <-- to be used by any view in Area1
                PartialViewXyz.cshtml <-- to be used anywhere in Area1
            _ViewStart.cshtml <-- area needs its own _ViewStart.cshtml
            Web.config <-- put custom HTML Helper namespaces in here
        Area1NameRegistration.cs <-- define routes for area1 here
    /Area2Name
        /Controllers
        /Models
        /Views
        Area2NameRegistration.cs <-- define routes for area2 here

/Controllers
    AccountController.cs
    HomeController.cs
/Models
/Views
    /Account
        /DisplayTemplates
            WidgetGhi.cshtml <-- to be used views in Views/Account
        /EditorTemplates
            WidgetGhi.cshtml <-- to be used views in Views/Account
        PartialViewGhi.cshtml <-- to be used by AccountController
    /Home
        (same pattern as Account, views & templates are controller-specific)
    /Shared
        /DisplayTemplates 
            EmailAddress.cshtml <-- to be used by any view in any area
            Time.cshtml <-- to be used by any view in any area
            Url.cshtml <-- to be used by any view in any area
        /EditorTemplates
            EmailAddress.cshtml <-- to be used by any view in any area
            Time.cshtml <-- to be used by any view in any area
            Url.cshtml <-- to be used by any view in any area
        _Layout.cshtml <-- master layout page with sections
        Error.cshtml <-- custom page to show if unhandled exception occurs
    _ViewStart.cshtml <-- won't be used automatically in an area
    Web.config <-- put custom HTML Helper namespaces in here

इसका मतलब है कि यदि आप किसी विजेट-कंट्रोलर जैसी किसी चीज के साथ काम कर रहे हैं, तो आपको संबंधित WidgetViewModels, WidgetViews, WidgetEditorTemplates, WidgetDisplayTemplates, आदि को खोजने के लिए अन्य फ़ोल्डरों में देखना होगा। जैसा कि यह बोझिल हो सकता है, मैं इससे चिपक जाता हूं और इससे विचलित नहीं होता हूं। ये एमवीसी सम्मेलन। जहाँ तक एक ही फ़ोल्डर में एक मॉडल, नियंत्रक, और दृश्य डालने की बात है, लेकिन विभिन्न नामस्थानों के साथ, मैं इससे बचता हूं क्योंकि मैं ReSharper का उपयोग करता हूं। यह स्क्विग्ली को एक नेमस्पेस को रेखांकित करेगा जो उस फ़ोल्डर से मेल नहीं खाता जहां क्लास स्थित है। मुझे पता है कि मैं इस R # सुविधा को बंद कर सकता हूं, लेकिन यह परियोजना के अन्य हिस्सों में मदद करता है।

गैर-श्रेणी की फ़ाइलों के लिए, MVC आपको बॉक्स से सामग्री और लिपियाँ देता है। हम अपने सभी स्थिर / गैर-संकलित फ़ाइलों को इन स्थानों में रखने की कोशिश करते हैं, फिर से, सम्मेलन का पालन करने के लिए। किसी भी समय हम एक js लाइब्रेरी को शामिल करते हैं जो थीम (चित्र और या सीएसएस) का उपयोग करता है, थीम फ़ाइलें सभी / सामग्री के तहत कहीं जाती हैं। स्क्रिप्ट के लिए, हम सीधे उन सभी को सीधे / स्क्रिप्ट में डालते हैं। मूल रूप से यह वीएस से जेएस इंटेलीसेन्स पाने के लिए था, लेकिन अब जब हम आर # से जेएस इंटैलिजेंस प्राप्त करते हैं, तो / इन लिपियों में प्लेसमेंट की परवाह किए बिना, मुझे लगता है कि हम इससे विचलित हो सकते हैं और स्क्रिप्ट को बेहतर व्यवस्थित करने के लिए फ़ोल्डर से विभाजित कर सकते हैं। क्या आप ReSharper का उपयोग कर रहे हैं? यह शुद्ध सोने का IMO है।

सोने का एक और छोटा टुकड़ा जो रिफैक्टरिंग में बहुत मदद करता है वह है T4MVC। इसका उपयोग करते हुए, हमें क्षेत्र के नाम, नियंत्रक नाम, कार्रवाई नाम, यहां तक ​​कि सामग्री और स्क्रिप्ट में फ़ाइलों के लिए स्ट्रिंग पथ में टाइप करने की आवश्यकता नहीं है। T4MVC दृढ़ता से आप के लिए सभी जादुई तार टाइप करता है। यहाँ एक छोटा सा नमूना है कि कैसे आपकी परियोजना संरचना उतनी मायने नहीं रखती है अगर आप T4MVC का उपयोग कर रहे हैं:

// no more magic strings in route definitions
context.MapRoutes(null,
    new[] { string.Empty, "features", "features/{version}" },
    new
    {
        area = MVC.PreviewArea.Name,
        controller = MVC.PreviewArea.Features.Name,
        action = MVC.PreviewArea.Features.ActionNames.ForPreview,
        version = "december-2011-preview-1",
    },
    new { httpMethod = new HttpMethodConstraint("GET") }
);

@* T4MVC renders .min.js script versions when project is targeted for release *@
<link href="@Url.Content(Links.content.Site_css)?r=201112B" rel="stylesheet" />
<script src="@Url.Content(Links.scripts.jquery_1_7_1_js)" type="text/javascript">
</script>

@* render a route URL as if you were calling an action method directly *@
<a href="@Url.Action(MVC.MyAreaName.MyControllerName.MyActionName
    (Model.SomeId))">@Html.DisplayFor(m => m.SomeText)</a>

// call action redirects as if you were executing an action method
return RedirectToAction(MVC.Area.MyController.DoSomething(obj1.Prop, null));

2. डेटा का उपयोग: मुझे पेटाको के साथ कोई अनुभव नहीं है, लेकिन मुझे यकीन है कि यह जांचने लायक है। आपकी जटिल रिपोर्टों के लिए, क्या आपने SQL सर्वर रिपोर्टिंग सेवाओं पर विचार किया है? या, आप एक अलग db पर चल रहे हैं? क्षमा करें, आप जो पूछ रहे हैं, मैं उस पर स्पष्ट नहीं हूं। हम EF + LINQ का उपयोग करते हैं, लेकिन डोमेन कक्षाओं में रिपोर्ट कैसे उत्पन्न करते हैं, इसके बारे में भी हम कुछ ज्ञान रखते हैं। इस प्रकार, हमारे पास नियंत्रक कॉल डोमेन सेवा कॉल रिपॉजिटरी है, इसके बजाय सीधे नियंत्रक कॉल रिपॉजिटरी है। तदर्थ रिपोर्टों के लिए हम SQL रिपोर्टिंग सेवा का उपयोग करते हैं, जो फिर से सही नहीं है, लेकिन हमारे उपयोगकर्ता आसानी से एक्सेल में डेटा लाने में सक्षम होना पसंद करते हैं, और SSRS उस पर हमें आसान बनाता है।

3. क्लाइंट-साइड कोड संगठन और यूआई प्रतिपादन: यह वह जगह है जहां मुझे लगता है कि मैं कुछ मदद की पेशकश करने में सक्षम हो सकता हूं। MVC विनीत सत्यापन और विनीत AJAX की पुस्तक से एक पृष्ठ लें। इस पर विचार करो:

<img id="loading_spinner" src="/path/to/img" style="display:none;" />
<h2 id="loading_results" style="display:none;">
    Please wait, this may take a while...
</h2>
<div id="results">
</div>
<input id="doSomethingDangerous" class="u-std-ajax" 
    type="button" value="I'm feeling lucky" 
    data-myapp-confirm="Are you sure you want to do this?"
    data-myapp-show="loading_spinner,loading_results" 
    data-myapp-href="blah/DoDangerousThing" />

अब (इस पर बाद में) के लिए ajax सफलता समारोह पर ध्यान न दें। आप अपने कुछ कार्यों के लिए एक स्क्रिप्ट के साथ भाग सकते हैं:

$('.u-std-ajax').click(function () {
    // maybe confirm something first
    var clicked = this;
    var confirmMessage = $(clicked).data('myapp-confirm');
    if (confirmMessage && !confirm(confirmMessage )) { return; } 

    // show a spinner?  something global would be preferred so 
    // I dont have to repeat this on every page 
    // maybe the page should notify the user of what's going on 
    // in addition to the dialog?
    var show = $(clicked).data('myapp-show');
    if (show) {
        var i, showIds = show.split(',');
        for (i = 0; i < showIds.length; i++) {
            $('#' + showIds[i]).show();
        }
    }

    var url = $(clicked).data('myapp-href');
    if (url) {
        $.ajax({
            url: url,
            complete: function () {                     
                // Need to hide the spinner, again would prefer to 
                // have this done elsewhere
                if (show) {
                    for (i = 0; i < showIds.length; i++) {
                        $('#' + showIds[i]).hide();
                    }
                }
            }
        });
    }
});

उपरोक्त कोड पुष्टि की देखभाल करेगा, स्पिनर को दिखाना, प्रतीक्षा संदेश दिखाना, और अजाक्स कॉल पूरा होने के बाद स्पिनर / प्रतीक्षा संदेश को छिपाना। आप डेटा का उपयोग करके व्यवहार को कॉन्फ़िगर करते हैं- * विशेषताएँ, विनीत पुस्तकालयों की तरह।

सामान्य सवाल

- क्लाइंट MVC बनाम सर्वर MVC? मैंने सफलता के कार्य में आपके द्वारा की गई कार्रवाइयों को लाइब्रेरियलाइज करने की कोशिश नहीं की क्योंकि ऐसा लगता है कि आपका कंट्रोलर JSON लौटा रहा है। यदि आपके नियंत्रक JSON लौटा रहे हैं, तो आप KnockoutJS को देखना चाहते हैं। नॉकआउट जेएस संस्करण 2.0 आज जारी किया गया था । यह आपके JSON में सही प्लग-इन कर सकता है, ताकि एक देखने योग्य क्लिक स्वचालित रूप से आपके जावास्क्रिप्ट टेम्प्लेट में डेटा को बाँध सके। दूसरी ओर, यदि आपको अपने ऐजैक्स एक्शन के तरीकों से एतराज नहीं है, तो JSON के बजाय HTML को लौटाएं, वे अपने LI बच्चों के साथ पहले से निर्मित UL को वापस कर सकते हैं, और आप डेटा-myapp-response = का उपयोग करके किसी तत्व में संलग्न कर सकते हैं "परिणाम"। आपका सफलता समारोह तब बस इस तरह दिखेगा:

success: function(html) {
    var responseId = $(clicked).data('myapp-response');
    if (responseId) {
        $('#' + responseId).empty().html(html);
    }
}

इसके लिए मेरा सबसे अच्छा जवाब देने के लिए, यदि आपको JSON को अपने एक्शन तरीकों से वापस करना होगा, तो आप सर्वर-साइड व्यू को स्किप कर रहे हैं, इसलिए यह वास्तव में सर्वर MVC नहीं है - यह सिर्फ MC है। यदि आप आंशिक रूप से html.jult कॉल करने के लिए html के साथ लौटते हैं, तो यह सर्वर MVC है। तो अगर आपके ऐप को अजाक्स कॉल के लिए JSON डेटा वापस करना होगा, तो क्लाइंट MVVM जैसे KnockoutJS का उपयोग करें।

किसी भी तरह से, मुझे आपके द्वारा पोस्ट किया गया JS पसंद नहीं है क्योंकि यह आपके लेआउट (html टैग) को व्यवहार (अतुल्यकालिक डेटा लोड) के साथ मिलाता है। आंशिक JSON व्यूयूमल डेटा के साथ आंशिक HTML विचारों या क्लाइंट MVVM के साथ सर्वर MVC चुनना आपके लिए इस समस्या को हल करेगा, लेकिन मैन्युअल रूप से जावास्क्रिप्ट में DOM / HTML का निर्माण चिंताओं के पृथक्करण का उल्लंघन करता है।

- जावास्क्रिप्ट फ़ाइल निर्माण जाहिरा तौर पर minification विशेषताएँ .NET 4.5 में आ रही हैं । यदि आप विनीत मार्ग पर जाते हैं, तो आपको अपने सभी JS को 1 स्क्रिप्ट फ़ाइल में लोड करने से रोकना नहीं चाहिए। मैं प्रत्येक इकाई प्रकार के लिए अलग-अलग JS फाइलें बनाने के बारे में सावधान रहूंगा, आप JS फाइल विस्फोट के साथ समाप्त हो जाएंगे। याद रखें, आपकी स्क्रिप्ट फ़ाइल लोड होने के बाद, ब्राउज़र को इसे भविष्य के अनुरोधों के लिए कैश करना चाहिए।

- जटिल प्रश्नों को मैं जटिल होने के नाते पेजिंग, छँटाई, आदि जैसी सुविधा नहीं मानता। मेरी प्राथमिकता URL के और सर्वर-साइड तर्क के साथ इसे संभालना है, ताकि db प्रश्नों को आवश्यकतानुसार सीमित किया जा सके। हालाँकि हम Azure पर तैनात हैं, इसलिए क्वेरी ऑप्टिमाइज़ेशन हमारे लिए महत्वपूर्ण है। उदाहरण के लिए /widgets/show-{pageSize}-per-page/page-{pageNumber}/sort-by-{sortColumn}-{sortDirection}/{keyword}:। EF और LINQ से लेकर एंटिटीज, जैसे कि .Take (), .Skk (), .OrderBy (), और .OderByDescending () जैसे तरीकों से पेजिंग और सॉर्टिंग को हैंडल कर सकते हैं, इसलिए आपको db ट्रिप के दौरान क्या चाहिए। मुझे अभी तक एक ग्राहक की जरूरत नहीं मिली है, इसलिए मैं ईमानदारी से उनके बारे में ज्यादा नहीं जानता। उस पर अधिक सलाह के लिए अन्य उत्तरों को देखें।

- प्रोजेक्ट सिल्क इस बारे में कभी नहीं सुना, इसे जांचना होगा। मैं स्टीव सैंडरसन, उनकी किताबों, उनकी बिगुलकेशन इटेम एचटीएमएल हेल्पर और उनके ब्लॉग का बहुत बड़ा प्रशंसक हूं। कहा कि, मुझे उत्पादन में नॉकआउट के साथ कोई अनुभव नहीं है । मैंने इसके ट्यूटोरियल की जाँच की है, लेकिन मैं कम से कम संस्करण 2.0 तक कुछ करने की कोशिश नहीं कर रहा हूँ। जैसा कि मैंने उल्लेख किया, नॉकआउट जेएस 2.0 अभी जारी किया गया था।

- एन-टीयर यदि टियर द्वारा आपका मतलब अलग-अलग भौतिक मशीन से है, तो नहीं, मुझे नहीं लगता कि कुछ भी किसी भी विंडोज़ से बाहर जाता है। आम तौर पर 3-स्तरीय का मतलब है कि आपके पास 3 मशीनें हैं। तो आपकी प्रस्तुति के रूप में आपके पास एक मोटा ग्राहक हो सकता है, जो उपयोगकर्ता की मशीन पर चलता है। वसा ग्राहक एक सेवा स्तरीय का उपयोग कर सकता है, जो एक एप्लिकेशन सर्वर पर चलता है और एक्सएमएल या जो भी वसा ग्राहक को देता है। और सर्विस टियर को SQL सर्वर से 3rd मशीन पर अपना डेटा मिल सकता है।

1 स्तरीय पर MVC एक परत है। आपके नियंत्रक, मॉडल और विचार सभी आपकी प्रस्तुति परत का हिस्सा हैं, जो भौतिक वास्तुकला में 1 स्तरीय है। एमवीसी मॉडल-व्यू-कंट्रोलर पैटर्न को लागू करता है, जो कि आपको अतिरिक्त परतें दिखाई दे रही है। हालाँकि, इन 3 पहलुओं को टियर या लेयर के रूप में नहीं समझने की कोशिश करें। इन तीनों को प्रेजेंटेशन लेयर कंसर्न के रूप में सोचने की कोशिश करें।

अध्यक्ष / बस / डेटा टिप्पणी के बाद अपडेट करें

ठीक है, इसलिए आप टियर और लेयर को एक-दूसरे से अलग-अलग तरीके से इस्तेमाल कर रहे हैं। मैं आमतौर पर तार्किक / प्रोजेक्ट / असेंबली डिवीजनों के लिए "लेयर" शब्द का उपयोग करता हूं, और भौतिक नेटवर्क पृथक्करण के लिए स्तरीय हूं। गलतफहमी के लिए खेद है।

आपको एमवीसी शिविर में काफी लोग मिलेंगे, जो कहते हैं कि आपको अपने इकाई डेटा मॉडल के लिए एमवीसी में "मॉडल" का उपयोग नहीं करना चाहिए, और न ही आपको व्यापार तर्क के लिए अपने नियंत्रकों का उपयोग करना चाहिए। आदर्श रूप से आपके मॉडल दृश्य-विशिष्ट दृश्यमॉडल होने चाहिए। आटोमैपर जैसी किसी चीज़ का उपयोग करते हुए, आप अपने डोमेन मॉडल से अपनी संस्थाओं को लेते हैं और उन्हें ViewModels में डीटीओ करते हैं, विशेष रूप से दृश्य द्वारा उपयोग के लिए खोदे गए।

कोई भी व्यावसायिक नियम आपके डोमेन का हिस्सा होना चाहिए, और आप उन्हें डोमेन सेवाओं / फ़ैक्टरी पैटर्न का उपयोग करके लागू कर सकते हैं / जो आपके डोमेन परत में उपयुक्त है, एमवीसी प्रस्तुति परत में नहीं। नियंत्रकों को गूंगा होना चाहिए, हालांकि मॉडल के रूप में बहुत गूंगा नहीं है, और व्यवसाय ज्ञान की आवश्यकता वाले किसी भी चीज़ के लिए डोमेन को जिम्मेदारी देनी चाहिए। कंट्रोलर HTTP अनुरोधों और प्रतिक्रियाओं के प्रवाह का प्रबंधन करते हैं, लेकिन वास्तविक व्यापार मूल्य के साथ कुछ भी नियंत्रक के वेतन ग्रेड से ऊपर होना चाहिए।

तो, आप अभी भी एक स्तरित वास्तुकला हो सकते हैं, एमवीसी के साथ प्रस्तुति परत के रूप में। यह आपके एप्लिकेशन लेयर, सर्विस लेयर, या डोमेन लेयर का एक क्लाइंट है, यह इस बात पर निर्भर करता है कि आप इसे कैसे आर्किटेक्ट करते हैं। लेकिन अंततः आपका इकाई मॉडल डोमेन का हिस्सा होना चाहिए, न कि एमवीसी में मॉडल।


मैं इस जवाब से पूरी तरह सहमत हूँ! विशेष रूप से: • रिचार्ज एक MVC जीनियस है ... आईडीई नेविगेशन की जाँच करने में त्रुटि से, इसकी उपयोगिता मुझे उड़ा देती है! • सर्वर-साइड MVC लगभग हमेशा सबसे अच्छा दृष्टिकोण है। MVC 3 अलग-अलग स्तरों नहीं है, यह एक एकल प्रस्तुति परत है - मैंने वास्तव में इसके बारे में कभी इस तरह से नहीं सोचा था, लेकिन यह बिल्कुल सही है।
स्कॉट रिप्पी

बहुत अच्छा जवाब, निश्चित रूप से मैं अपने 300 प्रतिनिधि की लागत की तलाश में था। यदि आप टोरंटो क्षेत्र में हैं, तो पेय मुझ पर है :)

btw मैं हमेशा एन-टीयर को प्रेसीडेंट / बस / डाटा मानता था, जहाँ वे शारीरिक रूप से बैठे थे। इसलिए मैंने कहा कि MVC उस आर्किटेक्चर को लगभग हटा देता है क्योंकि यह मूल रूप से 3 को जोड़ती है, आपने जो कुछ कहा है वह इससे सहमत है लेकिन इस पर एक अलग दृष्टिकोण भी देता है।

मैं ViewModel, मॉडल-प्रति-दृश्य, दृष्टिकोण के खिलाफ चेतावनी दूंगा। मैं हाल ही में ऐसी स्थिति में आया था जहाँ मैं बाद में चाहूंगा कि मुझे DTO से ViewModel में यह अमूर्तता नहीं मिली। देखें: stackoverflow.com/q/7181980/109456

एक सामान्य नियम के रूप में, मैं jQuery को देखना पसंद नहीं करता और इसके बजाय ऑब्जेक्ट को इंटरफेस के साथ लिखता हूं जो किसी भी सर्वर-साइड देव को JQ या DOM API के साथ व्यापार करने के लिए बहुत तेज़ी से समझने में सक्षम होगा। मैं भी वास्तव में Django के URLConfig अवधारणा को पसंद करता हूं और इसे पृष्ठों पर कार्यान्वयन के लिए ऑब्जेक्ट सेट करने में मददगार पाया है। मुझे नहीं पता कि एमवी क्या है? पुस्तकालय मेरे लिए हालांकि करने वाले हैं। वे समस्या के लिए एकदम सही नहीं हैं, IMO और DOM + इवेंट डेलिगेशन वह सभी मॉडल हैं जिनकी मुझे विशिष्ट संरचना से अत्यधिक जुड़े बिना पृष्ठों को संभालने की आवश्यकता है।
एरिक रिपेन

6

मैं पूर्ण उत्तर नहीं लिखने जा रहा हूं, लेकिन कुछ सुझाव साझा करना चाहता हूं।

मेरी युक्तियां:

1. परियोजना संरचना
मैंने पाया है कि डिफ़ॉल्ट MVC संरचना मेरे लिए अच्छा नहीं है। मैं आमतौर पर एक ही समय में एक ही इकाई (विचार उत्पाद, आदेश, ग्राहक) के नियंत्रक, विचार और मॉडल में काम करता हूं। इसलिए, मुझे एक ही फ़ोल्डर में फाइलें रखना पसंद है, लेकिन विभिन्न नामस्थानों के साथ।

2. डेटा
यदि आप Linq-to-SQL या EF के साथ जाते हैं तो आपको बाद में पछतावा होगा।
मैं पेटाकोका का उपयोग करता हूं जो मुझे मैपिंग दर्द के बिना एसक्यूएल पुनर्प्राप्त करने और रिकॉर्ड अपडेट करने की अनुमति देता है, लेकिन चीजों को करने और प्रदर्शन बुरे सपने के बिना एक नया तरीका सीखने के बिना।

पेटाकोको विशेषताओं के साथ प्रारंभिक POCO वर्ग बनाने के लिए मेरे पास एक कोड जनरेटर है, और फिर कुछ फ़ील्ड जोड़े जाने या हटाए जाने पर कक्षा को बदल दें।

पेटाकोको गतिशील और मानक कक्षाओं के साथ काम करता है, इसलिए आपके पास कोई समझौता नहीं है (बड़े पैमाने पर सभी गतिशील और डैपर सभी मानक वर्ग हैं)

मैं SqlBuilder में निर्मित मास्टर एसक्यूएल का उपयोग भी करता हूं, जिसमें इकाई के लिए सभी मानक शामिल हैं, लेकिन कोई भी नहीं है इसलिए मैं एक इकाई या सूची को पुनः प्राप्त करने के लिए उसी SQL का पुन: उपयोग करता हूं।

3. Jquery आप एक सामान्य jQuery कॉल (HTML तत्व के अंदर कुछ डेटा भरकर) का उपयोग करके यूआई के कुछ हिस्सों को स्टैंडराइज़ कर सकते हैं।

उदाहरण के लिए, मेरे पास हटाने के लिए यह है।

var deleteLinkObj;
// delete Link
$('.jbtn-borrar').click(function () {
    deleteLinkObj = $(this);  //for future use
    $('#delete-dialog').dialog('open');
    return false; // prevents the default behaviour
});
$('#delete-dialog').dialog({
    autoOpen: false, width: 400, resizable: false, modal: true, //Dialog options
    buttons: {
        "Borrar": function () {
            $.post(deleteLinkObj[0].href, function (data) {  //Post to action
                if (data == 'OK') {
                    deleteLinkObj.closest("tr").hide('fast'); //Hide Row
                }
                else {
                    alert(data);
                }
            });
            $(this).dialog("close");
        },
        "Cancelar": function () {
            $(this).dialog("close");
        }
    }
});

मुझे बस jbtn-borrarहाइपरलिंक पर कक्षा जोड़ने की आवश्यकता है , और यह एक संवाद दिखाता है, रिकॉर्ड हटाएं और छिपाएंtr

लेकिन इसे उखाड़ फेंके नहीं। आपका ऐप हर दृश्य में छोटे स्पर्श के साथ चमक जाएगा।

क्लाइंट MVC बनाम सर्वर MVC
सर्वर MVC। आंशिक विचारों का लाभ उठाएं जिन्हें आप प्रारंभिक प्रतिपादन में उपयोग कर सकते हैं और उसी दृश्य का उपयोग करके अजाक्स के साथ कुछ भागों को ताज़ा कर सकते हैं। देखिये यह बेहतरीन लेख

जटिल प्रश्नों को कैसे संभाला जाना चाहिए (इसे एक रिपोर्ट कह सकते हैं)
मैं एक वर्ग का उपयोग करता हूं जिसमें रिपोर्ट पैरामीटर गुण (MVC स्वचालन का उपयोग करने के लिए आसान) और एक Generateविधि है जो क्वेरी को निष्पादित करती है और एक कस्टम वर्ग की सूची (यदि आप डॉन भरें ) का उपयोग करें 't में एक वर्ग है जो ViewModel को फिट करता है)
आप इस वर्ग को दृश्य के मॉडल के रूप में उपयोग कर सकते हैं और उत्पन्न सूची के साथ तालिका भर सकते हैं।

माइक्रोसॉफ्ट का प्रोजेक्ट सिल्क
ओवररेल्टेड। विपरीत दिशा में जितना हो सके उतनी तेजी से दौड़ें।


मजेदार, जैसा कि मैंने प्रोजेक्ट सिल्क के माध्यम से पढ़ा है, मुझे यह अजीब लग रहा है और मैं इसे जगह नहीं दे सका।

3

1. परियोजना की संरचना

मेरे पास मेरे समाधान में 2 परियोजना फाइलें हैं

1) सेवा / व्यापार परत मैं अपने सभी व्यावसायिक तर्क और DB पहुँच कोड और POCO को इस अलग परियोजना में रखता हूँ। यदि आप ORM का उपयोग कर रहे हैं, तो ORM DB परत को पहले ही सार कर देता है, तो डेटा एक्सेस लेयर की कोई आवश्यकता नहीं है।

2) UI लेयर में मेरे सभी दृश्य, नियंत्रक, मॉडल, लिपियाँ, CSS शामिल हैं

मैं अपने नियंत्रक, दृश्य, स्क्रिप्ट और सीएसएस बनाने की कोशिश करता हूं, सभी एक समान फ़ोल्डर संरचना का उपयोग करते हैं। जितना संभव हो उतना URL पथ से मिलान करने के लिए मेरी फ़ाइलों की संरचना करें। कस्टम रूटिंग लिखने से बचने के लिए।

जितना संभव हो सके DisplayTemplates, EditorTemplates, आंशिक विचार और साझा किए गए फ़ोल्डर का उपयोग करें।

मैं तब अपने सभी लिपियों को समान क्षेत्रों से मिलान करने के लिए संरचना करता हूं, मेरी c # फ़ाइलों के नियंत्रकों तो मेरे पास एक सामान्य.जेएस फ़ाइल रूट पर एक जेएस फ़ाइल प्रति पृष्ठ और प्रत्येक क्षेत्र के लिए एक सामान्य.जेएस फ़ाइल होगी।

CSS फाइलें मेरे पास सामान्य रूप से 2 + n (जहां n क्षेत्रों की संख्या है) 1 CSS फ़ाइल लैंडिंग पृष्ठ के लिए सीएसएस केवल त्वरित पृष्ठ लोड समय के साथ मदद करने के लिए है (शायद व्यवसाय / कॉर्पोरेट वातावरण के लिए इतना महत्वपूर्ण नहीं है) 2 सीएसएस फ़ाइल एक सामान्य है। सभी अन्य पृष्ठों के लिए सभी शैलियाँ हैं। फिर प्रत्येक क्षेत्र के लिए एक अन्य common.css फ़ाइल उदाहरण के लिए एक AdminArea.css फ़ाइल जिसमें प्रत्येक व्यवस्थापक पृष्ठ के लिए CSS है।

2. डेटा का उपयोग

अगर मैं Entity फ्रेमवर्क का उपयोग करता हूं तो मैं CodeFirst का उपयोग करता हूं क्योंकि यह POCOS के साथ बहुत अच्छा काम करता है और आपके पास बनाए रखने के लिए कोई मॉडल नहीं है। nHibernate ज्यादा शक्तिशाली है लेकिन इसमें स्टेपर लर्निंग कर्व है। DB परिणामों के पेजिंग के लिए मेरे पास एक पुन: प्रयोज्य उपयोग है c # वर्ग और मेरे सभी विचारों के लिए उपयोग किए जाने वाले patial view।

जटिल प्रश्नों और जनरेटिंग रिपोर्ट के लिए मैं संग्रहीत प्रक्रियाओं का उपयोग करता हूं। LINQ को लिखने और बनाए रखने और अधिक शक्ति प्रदान करने के लिए वे बहुत आसान हैं। उन्हें SSRS जैसी अन्य सेवाओं द्वारा भी पुन: उपयोग किया जा सकता है। मैं ऑटोमैटिक का उपयोग कर के डेटासेट को उसी POCOs में वापस ला सकता हूं जो एंट्री फ्रेमवर्क का उपयोग करता है।

3. क्लाइंट-साइड कोड संगठन और यूआई रेंडरिंग

एडुआर्डो मोल्टेनई उत्तर में एक अच्छा उदाहरण कोड है। इसके अलावा, मैं निश्चित रूप से नॉकआउट का उपयोग करने की सिफारिश करूंगा क्योंकि इसमें अच्छा टेंपलेटिंग और बाइंडिंग दोनों हैं। यदि आप अपने सभी AJAX कॉल के लिए JSON का उपयोग करते हैं, जो कि तब मैं बहुत उपयोग करता हूं तो UI ऑटो जेएस ऑब्जेक्ट्स के लिए एक बड़ा समय देने वाला है।

सामान्य सवाल

जटिल प्रश्नों को एक संग्रहित खरीद में रहना चाहिए। (देखें पन्नाधाय.कॉम की टिप्पणी)

आप अभी भी इस MVC का उपयोग करके अपने N-tiered वास्तुकला को बनाए रखते हैं।


1

मुझे हाल ही में यह विश्वास करने के लिए स्थानांतरित किया गया है कि यदि आप सूचीबद्ध तीन तकनीकों का उपयोग करने की योजना बनाते हैं, तो आपको पहले ऑर्चर्ड सीएमएस को अपनाना शुरू करना चाहिए । मेरा मानना ​​है कि यह आपकी केंद्रीय आवश्यकता का सबसे अच्छा एकल उत्तर है:

स्केलेबिलिटी बनाए रखने और एक समृद्ध, तेज, स्वच्छ यूआई बनाने की क्षमता के लिए कोड और तर्क को व्यवस्थित करने के लिए एक इष्टतम रणनीति क्या है?

Ochard परिदृश्य में, कुछ भी आप इसके विन्यास तंत्र के माध्यम से संबोधित नहीं कर सकते हैं आप या तो मुफ्त ऑनलाइन मॉड्यूल के अलावा, या अपना खुद का मॉड्यूल लिख रहे हैं (जो निश्चित रूप से C #, रेजर, वगैरह हैं)। कोड संगठन ऑर्चर्ड की ताकत है।

डेटा एक्सेस के लिए, पूर्ण-बोर ORM के लिए पर्याप्त पेशेवरों और विपक्ष हैं जो मुझे यह भी लगता है कि एक माइक्रो-ओआरएम सबसे अच्छा है। बड़े पैमाने पर या Dapper की कोशिश करो । दोनों को हंसेलमिन्यूट्स पर चित्रित किया गया था । मैं यह कहकर दोनों को संक्षेप में बताता हूँ: एसक्यूएल से अमूर्त लगभग एक परियोजना के तराजू के रूप में लगभग टूट जाता है। अंत में, डीबी पहुंच के लिए सबसे अच्छा समाधान यह अमूर्त एसक्यूएल कहा जाता है (व्यंग्य की बिट, लेकिन सच है)। माइक्रो-ओआरएम को उसी के साथ काम करने दें, और आपको सोना मिल गया है।

माइक्रो-ओआरएम के साथ ऑर्चर्ड डालें, और आप मक्खन की तरह स्टील का टुकड़ा कर सकते हैं। एर, जिसका अर्थ है कि आप जल्दी से विकसित कर सकते हैं, पैमाने, और कोड है जो आसानी से एक टीम द्वारा बनाए रखा जा सकता है जो हैंड-ऑफ प्राप्त करता है।


0

मुझे यकीन नहीं है कि मैं इस सवाल से कैसे चूक गया लेकिन मैं दो साल बाद अपने दो सेंट जोड़ूंगा।

क्लाइंट MVC बनाम सर्वर MVC? मेरी परियोजना पहले से ही एक सर्वर-साइड MVC संरचना है, इसलिए अभी भी ग्राहक MVC की आवश्यकता है जैसे Backbone.js प्रदान करता है?

एमवीसी और एमवी? इससे पहले कि यह क्लाइंट-साइड में धकेल दिया गया हो, मूल रूप से एक मार्केटिंग टर्म में विकसित हुआ है जो वास्तव में केवल यह वादा करता है कि किसी भी तरह डेटा को अन्य सामान से अलग किया जाएगा जो कि एक बड़ा विचार है और एक बड़ा विचार है लेकिन वास्तव में DIY के लिए उतना मुश्किल नहीं है। कोई फर्क नहीं पड़ता कि आप HTML में परिवर्तन करने के बीच में या उससे ठीक पहले क्या दृष्टिकोण ले रहे हैं, जो प्रस्तुति या इंटरैक्शन की संभावनाओं को प्रभावित करता है, वह यह है कि व्यवसाय डेटा के साथ क्या करना चाहता है, यह छांटने के लिए सबसे भयानक जगह है।

"व्यू लॉजिक" के बारे में कुछ खास नहीं है। एक ही सिद्धांत सभी तर्क पर लागू होना चाहिए। और वह यह है कि अब ऐसा कुछ भी मत करो , जो अब से पहले करने के लिए बहुत अधिक समझ में आता है। जब आप कुछ डेटा पास करने या एक नई प्रक्रिया शुरू करने से पहले आपके सभी बतख एक पंक्ति में होते हैं, तो पिछले चरण में सिस्टम में कुछ और समान करने के लिए और अधिक पुन: प्रयोज्य होने की संभावना है।

क्या प्रत्येक ऑब्जेक्ट (जैसे ऑर्डरहेडर.जेएस) के लिए जावास्क्रिप्ट फ़ाइलों को बनाया जाना चाहिए और फिर निर्माण के दौरान खनन / विलय किया जाना चाहिए? या सिर्फ एक ऑर्डर होना चाहिए। जेसी के पास ऑर्डरहेडर, ऑर्डरडेल, रिपोर्ट आदि के लिए तर्क हैं?

यह वास्तव में आप पर निर्भर है, लेकिन मैं एक-फाइल, एक-क्लास चीज़ से दूर होने की कोशिश करूंगा। मुझे कभी समझ नहीं आया कि यह उदाहरण के लिए सहायक फ़ाइल और इंटरफ़ेस को खोजने के लिए क्यों उपयोगी था, और लागू करने वाली फाइलें, आदि ... व्यापक चिंताओं पर वर्गीकृत करें। अगर यह थोड़ा लंबा चला जाए तो ctrl + f का उपयोग करना मुश्किल नहीं है।

उस ने कहा, आपको वेब पर फ़ाइलों को छोटा करने के लिए JS को कभी भी कम नहीं करना चाहिए। ब्राउज़रों ने जेएस को कैश किया ताकि आप पुराने जेएस को नई फाइलों में चिपकाकर उसी जावास्क्रिप्ट को फिर से लोड कर सकें। जावास्क्रिप्ट की चौंका देने वाली मात्रा को छोड़कर, केवल उस समय जब आपके पास पृष्ठ पर सभी जेएस नहीं होना चाहिए, जब इसकी एक बहुत बड़ी मात्रा है जो किसी भी ओवरलैप / ग्रे क्षेत्रों के साथ साइट के एक हिस्से के लिए अत्यधिक विशिष्ट है, किसी दिए गए पर कभी भी ज़रूरत नहीं होगी पृष्ठ।

और एफएफएस वेब पर जावास्क्रिप्ट के साथ निर्भरता प्रबंधन के साथ उपद्रव नहीं करते हैं। मध्यम से निम्न जटिलता वाली वेबसाइटों के लिए मुझे बच्चे को सील करने के लिए क्लब बनाना चाहते हैं। अपने तीसरे पक्ष के पुस्तकालयों को एक शीर्ष ब्लॉक में रखें। दूसरे ब्लॉक में आपका इन-हाउस लाइब्रेरी। और फिर आपका कार्यान्वयन कोड (जो आपके इन-हाउस लाइब्रेरी कोड के रूप में दसवां कभी नहीं होना चाहिए - यानी उस तीसरे बॉक में बहुत ही रसीला और स्पष्ट और समझने में आसान)।

जटिल प्रश्नों को कैसे संभाला जाना चाहिए? अभी मेरा प्रमुख सिद्धांत है / रिपोर्ट / आदेश-दर-तारीख / या उन पंक्तियों के साथ कुछ और मैं एक कस्टम SQL क्वेरी का उपयोग करता हूं जो एक कस्टम डेटासेट (या ViewModel) को रेजर व्यू में प्रस्तुत करता है। लेकिन पेजिंग, सॉर्टिंग, आदि के बारे में क्या? क्या क्लाइंट या सर्वर साइड होना बेहतर है? (बड़े डेटासेट मान लें - 2 से 3 सेकंड एसक्यूएल क्वेरी) मैंने माइक्रोसॉफ्ट के प्रोजेक्ट सिल्क के माध्यम से पढ़ा है। क्या यह जाने का एक अच्छा तरीका है? यह कैसे Backbone.js या अन्य की तुलना करता है?

ईमानदारी से, मैं कहूंगा कि आपके लिए जो कुछ भी आसान है वह ग्राहक के लिए बदबू नहीं है। वेब पेज आधुनिक तकनीक पर बहुत तेजी से लादते हैं। यदि अजाक्स में लागू करना आपके लिए बहुत दर्द है, नहीं। बस वही करें जो आप सबसे अच्छी तरह जानते हैं और फिर आप बाद में फैंसी पा सकते हैं और देख सकते हैं कि आपको पेजिंग के लिए कैसा लगा। यदि आप स्क्रैच से एक नया जटिल ऐप बना रहे हैं, तो आवश्यक से शुरू करें और बाद में नीट-ओ को हिट करें।

मैं एक एन-टियर आर्किटेक्चर का बहुत आदी हूं, क्या ये अवधारणाएं कुछ हद तक खिड़की से बाहर फेंकती हैं? ऐसा लगता है कि एमवीसी मिनी एन-टियर वर्गों के एक समूह की तरह है जो अतीत में फ्रंट-एंड या टॉप टियर रहा होगा।

यह वास्तव में इस बात पर निर्भर करता है कि एम.वी. है। IMO, सूक्ष्म जगत की चीज़ बहुत अच्छी तरह से काम करती है। विजेट का एक वर्ग जो डेटा, संचार और दृश्य-संबंधित सामान को आंतरिक रूप से अलग करता है, महान काम करता है। क्लाइंट-साइड वेब पर, महत्वपूर्ण बात, IMO, छोटी-छोटी चिंताओं में अनावश्यक रूप से विखंडित किए बिना चिंताओं को अलग रखने का एक संतुलन बनाए रखना है, जिसके पुनरावर्तन से चीजों को समझना और पुन: उपयोग करना और संशोधित करना मुश्किल हो जाता है। बेसिक "डुह" OOP यहां बहुत अच्छा काम करता है। आप जटिल प्रक्रियाएँ नहीं चाहते हैं। आप स्पष्ट रूप से नामित चीजों को चाहते हैं जिन्हें चारों ओर ले जाया जा सकता है और सामान करने के लिए कहा जा सकता है। यहाँ उस मोर्चे पर कुछ सुझाव दिए गए हैं:

  • KISS कि (OOP) इंटरफ़ेस मैं डोम या jQuery या कुछ और देखने के लिए एक चुटकी-मार सर्वर साइड देव मेरी कार्यान्वयन कोड में काफी जल्दी समझ नहीं सकता है नहीं करना चाहती। सभी व्यक्ति को यह जानना चाहिए कि एक डिव कंटेनर पर थप्पड़ मारने के लिए कौन सा वर्ग है और किसी दिए गए पृष्ठ पर यूआई का एक सामान्य सेट बनाने के लिए क्या स्विच करना है। किसी विषय पर विविधताएं अभी भी अच्छी तरह से प्रलेखित / टिप्पणी की गई विकल्प वस्तुओं में पास होने से पहले पूरी होनी चाहिए, क्योंकि उन्हें डॉक्यूमेंट को देखना शुरू करना होगा।

  • ठीक है तो आप ऐसा कैसे करते हैं? खैर, हमारे पास पहले से ही एक मॉडल है। इसे DOM कहा जाता है। और हमारे पास इवेंट डेलिगेशन है। यदि आप अंधाधुंध तरीके से ईवेंट बुदबुदाहट बंद नहीं कर रहे हैं (ऐसा न करें - यह वहां है क्योंकि यह उपयोगी है) आप चाहें तो शरीर से हर एक को भी उठा सकते हैं। फिर पारित घटना ऑब्जेक्ट की लक्ष्य संपत्ति की जांच करें और निर्धारित करें कि कौन 'जो भी हो।' यदि आप समझदारी से HTML डॉक्यूमेंट को संरचित कर रहे हैं, तो एक प्रतिनिधि मॉडल के रूप में इसका उपयोग नहीं करने का कोई कारण नहीं है। व्यवहार और सामग्री संरचना स्वाभाविक रूप से जुड़े हुए हैं। ओवरलैपिंग पहचानकर्ताओं के लिए दोनों के लिए ठीक है।

  • डेटा-बाइंडिंग के लिए भुगतान न करें और "पे" से मेरा तात्पर्य है "अपने कोडबेस पर एक पुस्तकालय को थप्पड़ मारना, जो आपको ऐसा करने के लिए हर समय कुछ-न-कुछ चमत्कारिक लाभ दिलाने के लिए जोर देता है, जो वास्तव में DIY के लिए कठिन नहीं है।" JQ का ईवेंट सिस्टम इसे बहुत आसान बनाता है।

उदाहरण समय:

function PoliticianData(){ //a constructor

    var
        that = this, //I hate 'that' but example so convention

        flavorsOfLie = {

            lies: "Oh Prism? Psh... no we're all good. There's a guy keeping an eye on that.",

            damnedLies: "50% of the people chose to not give a damn when asked whether it was better to let the terrorists win or not give a damn."

        }
    ;//end instance vars

    this.updateLies = function( lieType, newData ){
        flavorsOfLie[lieType] = newData;
        $(that).trigger({type:'update', lieType:lieType, newData: newData });
    }

    //so everytime you use the updateLies method, we can have a listener respond
    //and pass the data
}

var filthyLies = new PoliticianData();

$(filthyLies).on('update', function(e){
    stickNewDataInHTMLWithSomeFuncDefinedElsewhere(e.lieType, e.newData);
} );

filthyLies.update('damnedLies','50% of the people said they didn\'t give a damn');
//oh look, WaPo's front page just changed!
  • वेब न छिपाएँ इस महत्वपूर्ण बिंदु पर हिंग वाले सर्वर-साइड और ऐप देवों के लिए क्लाइंट-साइड को आसान बनाने के सभी शुरुआती प्रयासों में चूसने का मुख्य स्रोत। HTTP अनुरोध नहीं हैं और कभी भी जटिल नहीं थे। उन्हें समझने में आसान बनाने के लिए 18 @! $ # लेग लेग कन्फ्यूजिंग-इवेंट-नेम-एट-ए-स्टेज प्रत्येक मंचीयता की आवश्यकता नहीं थी। इसी तरह, क्लाइंट-साइड के बारे में जानने के लिए बहुत कुछ है लेकिन एचटीएमएल और डीओएम से छिपाने का कोई कारण नहीं है जो इसके ऊपर एक बड़े विशाल मॉडल को थप्पड़ मारकर इसके साथ बातचीत करता है। यह पहले से ही एक बड़ा विशाल मॉडल है और यह बहुत अच्छा काम करता है। हम सभी को इसे थोड़ा और प्रबंधनीय बनाने की आवश्यकता है जो कुछ समझदार ओओपी प्रथाओं और कुछ जेएस और डोम ज्ञान है।

  • अनुकूल लचीलापन

EXTjs <==== लचीलापन पैमाना ====> jQuery (जरूरी नहीं कि इसका कोई प्लग-इन हो)

IMO, ऐसे उपकरण जो आपको DIY तेजी से चलने देते हैं वे हमेशा बेहतर विकल्प होते हैं। आपके लिए यह सब करने वाले उपकरण केवल सही विकल्प हैं, जब आपके सिर पर कोई भी विशेष रूप से विवरण के बारे में नहीं चुना जा रहा है और आपको उस चीज़ पर नियंत्रण करने में कोई आपत्ति नहीं है जो आपको मदद करने वाली है। मैंने वास्तव में प्लग-इन देखा है जो यह सुनिश्चित करने के लिए HTML को मान्य करता है कि आप वहां सभी समान सटीक प्रदर्शन लक्षणों के साथ एक अलग प्रकार के तत्व को चुपके नहीं करते हैं। क्यूं कर? मेरे पास केवल सिद्धांत हैं। मुझे लगता है कि यह वास्तव में किसी को अपने सामान का उपयोग करने के विचार से घृणा करने के लिए पूरी तरह से उकसाता है जो कि इरादा नहीं था और यह हमेशा अनिवार्य रूप से है कि कोई व्यक्ति आपको यूआई में करना चाहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.