2013-02-08 11 views
6

मेरे पास ऐसी स्थिति है जहां मैं अपने नियंत्रकों को आर्किटेक्ट करने का बहस कर रहा हूं।किसी अन्य नियंत्रक की कार्रवाई को कॉल करना - फ़ाइल अपलोडर के लिए डिज़ाइन विचार - एमवीसी 4

निम्नलिखित नियंत्रक पर विचार करें:

public class FileSharingController : Controller 
    { 

     private readonly ICommandBus commandBus; 

     public FileSharingController(ICommandBus commandBus) 
     { 
      this.commandBus = commandBus; 
     } 

     [HttpPost]  
     public ActionResult PrepareMetadata(int blocksCount, string fileName, long fileSize) 
     { 
      ... 
     } 

     [HttpPost] 
     public ActionResult ClearFileMetadata(string fileName){ 
      ... 
     } 

     [HttpPost] [ValidateInput(false)] //$.ajax({ data: html5FormDataFileChunk , processData: false ... }) 
     public ActionResult UploadBlock(string fileName, int blockId){ 

      var fileUploadCommand = (FileUploadCommand)ExtractFromSessionData(fileName); 
      var result = commandBus.Submit(fileUploadCommand); 
      ... 
     } 

     public ActionResult CommitFileUploads(string[] filesToCommit){ 
      var commitFileUploadCommand = (CommitFileUploadCommand)ExtractFromSessionData(fileName); 
      var result = commandBus.Submit(commitFileUploadCommand); 
      ... 
     } 

इस नियंत्रक में, मैं आदेश पैटर्न का उपयोग और मेरे commandBus करने के लिए एक मॉडल है जो मेरे डोमेन के साथ इंटरफेस गुजरती हैं। नियंत्रक पर पहले तीन [HttpPost] विधियां एक उत्तरदायी फ़ाइल अपलोडिंग UI से jQuery AJAX कॉल को संभालने के लिए हैं।

उस स्थिति पर विचार करें जहां उपयोगकर्ता एक फॉर्म (एक साक्षात्कार) भरता है और इसके साथ कुछ फाइल अपलोड करता है। यद्यपि उपयोगकर्ता फॉर्म सबमिट करने से पहले फ़ाइलों को अपलोड कर सकता है, लेकिन मैं नहीं चाहता कि अपलोड की गई फाइलों को तब तक पूरा किया जाए जब तक कि वे फॉर्म सबमिट नहीं करते हैं और यह सत्यापन पास करता है। क्यों नियंत्रक पर पिछले विधि एक http समाप्ति बिंदु नहीं है यही कारण है।

public class InterviewController : Controller 
    { 
     [HttpGet] 
     public ActionResult UserInterview() 
     { 
      InterviewViewModel viewModel = new InterviewViewModel(); 
      return PartialView(viewModel); 
     } 

     [HttpPost] [AllowAnonymous] 
     public ActionResult UserInterview(InterviewViewModel viewModel) 
     { 
      if(ModelState.IsValid) 
      { 
       var fileSharingController = new FileSharingController(); 
       fileSharingController.CommitFileUploads(viewModel.Files); 
      } 

      return PartialView(viewModel); 
     } 

    } 

समस्या मैं FileSharingController में एक commandBus सुई आईओसी उपयोग कर रहा हूँ तो मैं बस के रूप में मैं कर रहा हूँ डिफ़ॉल्ट निर्माता के साथ यह दृष्टांत नहीं कर सकता है: इस तरह के रूप में मैं निम्नलिखित नियंत्रक की है।

मेरे विकल्पों पर विचार करने के लिए:

  • एक कस्टम नियंत्रक कारखाने बनाएं कोड में कहीं भी मेरी नियंत्रक instantiating अनुमति देने के लिए।
  • एक वेबएपीआई नियंत्रक में मेरी FileSharingController करें और एक सेवा

कौन इस स्थिति के लिए बेहतर डिजाइन मार्ग है के रूप में इलाज? यदि बाद वाला मामला, मैं CommitFileUploads() विधि निजी कैसे रख सकता हूं? मैं इसे एक endpoint कि प्रथम रूप के बाकी मान्य बिना शुरू किया जा सकता के रूप में उजागर किया नहीं करना चाहती।

उत्तर

2

आप इस तरह अपने नियंत्रक का दृष्टांत कर सकते हैं:

ICommandBus commandBus = DependencyResolver.Current.GetService<ICommandBus>(); 
var fileShareController = new FileSharingController(commandBus); 

जेनेरिक GetService() विधि विस्तार विधि है, इसलिए सुनिश्चित करें कि आप कर लिया है "System.Web.Mvc का उपयोग कर," सीएस फ़ाइल में लाइन।

लेकिन फिर भी, यह सहायक वर्ग है कि ध्यान में रखते हुए/पहले से ही अपलोड फ़ाइलों को संग्रहीत करने के लिए जिम्मेदार है, और यह दोनों नियंत्रकों से कहते हैं, बजाय मैन्युअल नियंत्रकों instantiating बेहतर है।

उदाहरण के लिए:

public class FileUploadManager 
{ 
    public FileUploadManager(ICommandBus commandBus, HttpSessionStateBase sessionState) 
    { 
     //.... 
    } 
} 

और फिर आप यह कहते हैं:

ICommandBus commandBus = DependencyResolver.Current.GetService<ICommandBus>(); 
var fileShareController = new FileUploadManager(commandBus, this.HttpContext.Session); 

या, आप DependencyResolver का उपयोग नहीं करना चाहते, तो आप दोनों नियंत्रक के कन्स्ट्रक्टर्स को ICommandBus गुजरती हैं, और उपयोग कि तत्काल सहायक वर्ग के संदर्भ में।

0

बस सिर्फ एक और conroller की वस्तु बना सकते हैं और अपने सभी सार्वजनिक तरीकों का उपयोग।

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