2012-08-22 6 views
5

मैं अपने .NET MVC 3 एप्लिकेशन पर विशेष रूप से एक थिंग में संपादन सहेजने के लिए इस Command Pattern को लागू करने का प्रयास कर रहा हूं। मैं आगे बढ़ने के तरीके से निराश हूं। इससे पहले कि मैं वास्तविक सवाल पर आते हैं, यहाँ सरल कोड है:.NET MVC 3 में कमान पैटर्न (नियंत्रक से जंक को हटाकर)

public class ThingController 
{ 
    private readonly ICommandHandler<EditThingCommand> handler; 

    public ThingController(ICommandHandler<EditThingCommand> handler) 
    { 
     this.handler = handler; 
    } 

    public ActionMethod EditThing(int id) 
    { 
     ...build EditThingViewModel and return with View... 
    } 

    [HttpPost] 
    public ActionMethod EditThing(int id, EditThingViewModel vm) 
    { 
     var command = new EditThingCommand 
     { 
      ...not sure yet... 
     }; 

     this.handler.Handle(command); 

     ...redirect somewhere... 
    } 
} 

मेरे EditThingViewModel मेरे डोमेन, POCO वर्गों के होते हैं, जो पूरी तरह से डिस्कनेक्ट किया गया है। ऐसा लगता है मेरी EditThingCommand की तरह इस तरह दिखना चाहिए:

public class EditThingCommand 
{ 
    Thing ModifiedThing; 
} 

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

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

+0

मैं पॉल स्टोवेल के लेख को देखने का सुझाव दूंगा, http://www.paulstovell.com/clean-aspnet-mvc-controllers –

+0

पर मिले एएसपी.नेट एमवीसी नियंत्रकों की सफाई सुझाव के लिए धन्यवाद! –

उत्तर

0

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

दूसरे शब्दों में, कमांड पैटर्न का उपयोग करते समय, सामान्य CRUD संचालन के लिए प्रतिस्थापन के रूप में आदेशों का उपयोग न करें। अधिक विशिष्टता के साथ और अधिक लाभ आता है।

0

मैंने अपने डोमेन के बाहर एक EditThingPostCommand बनाया है, जो पैरामीटर के रूप में EditThingViewModel लेता है। EditThingPostCommandHandler EditThingCommand बनाने और इसके हैंडलर को कॉल करने के लिए ज़िम्मेदार है।

यह काम करता है, लेकिन मुझे लगता है कि यह मेरे प्रश्न का सबसे अच्छा जवाब नहीं है। तर्कसंगत रूप से EditThingPostCommandHandler जो कुछ कर रहा है वह कस्टम ऑटोमैपर कॉन्फ़िगरेशन में किया जा सकता है, जो अभी भी नियंत्रक क्रिया विधि को साफ करने के उद्देश्य को पूरा करेगा।

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