11

मैं एमवीसी पैटर्न से बहुत परिचित नहीं हूं। क्या आप मुझे बता सकते हैं कि निम्नलिखित तीन नियंत्रक कार्रवाइयों में से कौन सा बेहतर है? धन्यवाद :)नियंत्रकों में linq क्वेरी रखने के लिए यह अच्छा अभ्यास है?

(1) कार्रवाई में क्वेरी है:

public ActionResult List() 
{ 
    var query = repository.Query().Where(it => it.IsHandled).OrderBy(it => it.Id); 
    // ... 
} 

(2) सेवा में क्वेरी है:

public ActionResult List() 
{ 
    var items = service.GetHandledItemsOrderById(); 
    // ... 
} 

(3) आदेश कार्रवाई में से है :

public ActionResult List() 
{ 
    var items = service.GetHandledItems().OrderBy(it => it.Id); 
    // ... 
} 

अगर हम (1) चुनते हैं, तो हमारे पास नियंत्रक में बहुत अधिक व्यवसाय तर्क है?

यदि हम (2) चुनते हैं, तो GetXXXByYYY() जैसी कई सेवा विधियां हो सकती हैं।

अगर हम चुनें (3), हम क्यों संपुटित Where(it => it.IsHandled) नहीं बल्कि
OrderBy(it => it.Id

कोई विचार?

उत्तर

3

यह निर्भर करता है। :)

मेरी राय:

मैं अपने सेवा ढीला रखने के लिए, डुप्लिकेट कोड को कम करना चाहते हैं। मैं पाइप और फिल्टर का प्रशंसक भी हूं।

यहां मैं क्या करूंगा (और क्या करें)।

सेवा

public ICollection<Item> GetHandledItems<TKey>(OrderingOptions<Item, TKey> orderingOptions) 
{ 
    return repository 
     .Query() 
     .WhereHandled() 
     .WithOrdering(orderingOptions) 
     .ToList();  
} 

ItemFilters.cs

public static IQueryable<Item> WhereHandled(this IQueryable<Item> source) 
{ 
    return source.Where(it => it.IsHandled); 
} 

public static IOrderedQueryable<T> WithOrdering<T, TKey>(
    this IQueryable<T> source, 
    OrderingOptions<T, TKey> orderingOptions) 
{ 
    return orderingOptions.SortDescending 
     ? source.OrderByDescending(orderingOptions.OrderingKey) :              
     source.OrderBy(orderingOptions.OrderingKey); 
} 

OrderingOptions.cs

public class OrderingOptions<T,TKey> 
{ 
    public OrderingOptions(Expression<Func<T,TKey>> orderingKey, bool sortDescending = false) 
    { 
     OrderingKey = orderingKey; 
     SortDescending = sortDescending; 
    } 

    public Expression<Func<T,TKey>> OrderingKey { get; private set; } 
    public bool SortDescending { get; private set; } 
} 

इस तरह, यो यू नियंत्रक में आदेश निर्दिष्ट कर सकते हैं: ऊपर और 3 विकल्पों के बीच

var items = service.GetHandledItems(new OrderingOptions(it => it.Id)); 

अंतर:

  • से ऊपर नियंत्रक पर लौटने से पहले अनुक्रम materializes। विकल्प 3 नहीं है, जो खतरनाक है (आप एमवीसी पैटर्न को देखने और तोड़ने के लिए लौटने वाली क्वेरी को समाप्त कर सकते हैं)।
  • जेनेरिक "ऑर्डरिंग" पीओसीओ, कहीं भी इस्तेमाल किया जा सकता है और आपके प्रश्न डी-आर-वाई रखता है।
  • सेवा गूंगा बन जाती है, और बस रिपोजिटरी और नियंत्रक (जो इसे करना चाहिए, आईएमओ) के बीच एक कमजोर हो जाता है। तर्क (उदाहरण फ़िल्टर) एक स्थान पर सारणीबद्ध।

HTH

+0

धन्यवाद। Bu अगर "GetHandledItems()" एक संग्रह देता है (IQueryable नहीं), हम क्वेरी पर अनुमान नहीं कर सकते हैं। यह प्रदर्शन को प्रभावित करेगा। –

+0

@Dylan - तो क्वेरी को निष्पादित करने से पहले, या तो इनलाइन या किसी अन्य पाइप विधि के माध्यम से सेवा में अपने अनुमानों को करें, उदाहरण के लिए: 'वापसी repo.Query()। जहां हैंडल()। WithOrdering()। AsSomeProjectedType() ' – RPM1984

+0

यह भी देखें यह ** शानदार ** एमवीसी पाइप्स और फ़िल्टर पर रॉबकॉन vid: http://www.asp.net/mvc/videos/aspnet-mvc-storefront-part-3-pipes-and-filters – RPM1984

4

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

+0

पेज आइटम है कि ईद द्वारा आदेश नियंत्रित किया जाता है को दिखाने के लिए की जरूरत है। क्यों "पहले से ही संभाला गया (संसाधित) आइटम प्रदर्शित करता है" व्यवसाय तर्क है और सेवा में होना चाहिए, जबकि "आईडी द्वारा आइटम ऑर्डर प्रदर्शित करें" प्रदर्शन वरीयता है? –

+0

मुझे लगता है कि "हैंडल किए गए आइटम प्रदर्शित करें" और "आईडी द्वारा डिस्प्ले आइटम ऑर्डर" दोनों प्रदर्शन वरीयता हैं? तो हमें 1 चुनना चाहिए? –

+1

मुझे लगता है कि मेरा प्रश्न होना चाहिए: (1) क्या "कहां है (यह => यह। IHandled)" व्यापार तर्क? (2) "ऑर्डरबी (यह => it.Id)" व्यवसाय तर्क है? –

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