2012-07-31 10 views
10

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

जैसे, नियंत्रकों में तर्क कम से कम रखा जाता है, लेकिन मैं अभी भी कोड का बहुत ही सूक्ष्म टुकड़े ऐसे ही

  • मान्य मॉडल
  • की व्यवस्था कार्रवाई विधि तर्क कुछ कार्य करने के लिए है
  • इन तर्कों के साथ कुछ सेवा का आह्वान करें, शायद परिणाम सत्यापित करें और मॉडल को अब अमान्य
  • अंत में सेवा के परिणाम से एक मॉडल तैयार करें, और उसे वापस करें।

कुछ लंबे मामले सेवा द्वारा लौटाई गई "स्थिति" के आधार पर अलग-अलग चीजें करते हैं।

यहाँ कुछ उदाहरणों की है:

[HttpPost] 
[AjaxOnly] 
[Authorize] 
public JsonResult Preview(string input) 
{ 
    LinkResult parsed = linkService.ParseUserInput(input); 
    if (parsed.Result == LinkParseResult.Used) 
    { 
     long? postId = parsed.Link.PostId; 
     if (postId.HasValue) 
     { 
      Post post = postService.GetById(postId.Value, false); 
      return Json(new 
      { 
       faulted = "used", 
       link = DetailsRoute(post), 
       id = postId 
      }); 
     } 
     else 
     { 
      return Json(new { faulted = "invalid" }); 
     } 
    } 
    else if (parsed.Result == LinkParseResult.Invalid) 
    { 
     return Json(new { faulted = "invalid" }); 
    } 
    else 
    { 
     Link link = parsed.Link; 
     if (link.Description != null && link.Description.Length > 200) 
     { 
      link.Description = link.Description.Substring(0, 200); 
     } 
     return AjaxView(link); 
    } 
} 

और (Post, PostModel डोमेन से आता दृश्य मॉडल है)

private PostModel PostModelConverter(Post post) 
{ 
    Link link = post.Link; 
    if (link == null) 
    { 
     throw new ArgumentException("post.Link can't be null"); 
    } 
    if (link.Type == LinkType.Html) 
    { 
     return new PostedLinkModel 
     { 
      Description = link.Description, 
      PictureUrl = link.Picture, 
      PostId = post.Id, 
      PostSlug = postService.GetTitleSlug(post), 
      Timestamp = post.Created, 
      Title = link.Title, 
      UserMessage = post.UserMessage, 
      UserDisplayName = post.User.DisplayName 
     }; 
    } 
    else if (link.Type == LinkType.Image) 
    { 
     return new PostedImageModel 
     { 
      PictureUrl = link.Picture, 
      PostId = post.Id, 
      PostSlug = postService.GetTitleSlug(post), 
      Timestamp = post.Created, 
      UserMessage = post.UserMessage, 
      UserDisplayName = post.User.DisplayName 
     }; 
    } 
    return null; 
} 

इस बारे में अगर दृश्य मॉडल वास्तव में होना चाहिए प्रश्न उठाता है वेब प्रोजेक्ट एक नियम के रूप में, या वे वास्तव में डोमेन, या कुछ अन्य परियोजना का हिस्सा हो सकते हैं।

मुझे यकीन नहीं है कि मैं पूर्वावलोकन कार्रवाई के बारे में बहुत कुछ कर सकता हूं, शायद लिंक प्राप्त करने वाले पूर्वावलोकन मॉडल का उपयोग करने के अलावा, और वर्णन को छोटा कर देता है, लेकिन यह दो पंक्तियों की तरह सहेजता है।

मॉडल कनवर्टर शायद कहीं और होना चाहिए, लेकिन मैं कहाँ है कि होना चाहिए के रूप में पता कर रहा हूँ।

एक और बिंदु जो दिमाग में आता है, अगर मुझे partial कीवर्ड का उपयोग करके इस नियंत्रक को विभाजित करना चाहिए (क्या यह स्वत: उत्पन्न वर्गों की तुलना में किसी अन्य चीज़ के लिए इसका उपयोग करने का एक बुरा अभ्यास है?), या विभिन्न नियंत्रकों का उपयोग करने वाले मार्ग जोड़ना किस कार्रवाई का अनुरोध किया गया है या किस http विधि का उपयोग किया जा रहा है, इसे संभालने का सामान्य तरीका क्या है?

+0

बस एक व्यक्तिगत वरीयता है, लेकिन आप इसके बदले स्विच स्टेटमेंट का उपयोग कर सकते हैं .. अन्यथा अगर ... आदि –

उत्तर

4

यह कई बार कहा गया है:
Business logic in the controller
Where should I put my controller business logic in MVC3
Keep Controllers Thin

साथ ही के बारे में कहीं लिखा:
ASP MVC Best Practices - Skinny Controllers
Keep Controllers Thin

समुदाय एक अच्छा आम सहमति है कि तर्क के इस प्रकार नियंत्रकों के बाहर अंतर्गत आता है पर हो रहा है। आम तौर पर मॉडल (या व्यूमोडेल) में, लेकिन व्यापार परत में कहीं

एक अंतिम नोट के रूप में, गैर ऑटोजनरेटेड कोड के लिए partials का उपयोग कर हतोत्साहित नहीं है। अगर चीजों को विभाजित करना समझ में आता है, तो ऐसा करें।बस इसके बारे में सोचें कि इसे विभाजित करने के आपके कारण क्या हैं। यह मामला-दर-मामला जैसी चीज होगी।

2
private PostModel PostModelConverter(Post post) 
{ 
    Link link = post.Link; 
    if (link == null) 
    { 
     throw new ArgumentException("post.Link can't be null"); 
    } 
    if (link.Type == LinkType.Html) 
    { 
     var model = AutoMapper.Map<PostedLinkModel>(post); 
     model.PostSlug = postService.GetTitleSlug(post); 
     return model; 
    } 
    else if (link.Type == LinkType.Image) 
    { 
     var model = AutoMapper.Map<PostedImageModel>(post); 
     model.PostSlug = postService.GetTitleSlug(post); 
     return model; 
    } 
    return null; 
} 

http://www.viddler.com/v/b568679c

0

नियंत्रक किसी भी डोमेन तर्क शामिल नहीं होंगे

नियंत्रक करने के लिए जिम्मेदार होना चाहिए:

सत्यापित किया जा रहा इनपुट

कॉलिंग मॉडल दृश्य

वापसी दृश्य तैयार करने के लिए या किसी अन्य क्रिया पर रीडायरेक्ट करें

यदि आप किसी अन्य चीज को कर रहे हैं तो आप इसे गलत जगह पर कर रहे हैं, बल्कि यह मॉडल जिम्मेदारी है जिसे आप नियंत्रक में कर रहे हैं।

यदि आप इस नियम का पालन करते हैं तो आपकी क्रिया विधि कोड की 20 से 25 पंक्तियों से अधिक नहीं होगी। इयान कूपर का उत्कृष्ट पोस्ट Skinny Controller Fat Model है, इसे पढ़ें।

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