2015-12-16 3 views
7

इस उदाहरण को नीचे स्थिर वर्ग देखें।सी # में इस स्थिर वर्ग को दोबारा करने का सबसे अच्छा तरीका?

public static class BackgroundTaskExecuter 
{ 
    public static void MethodA() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceA>()) 
     { 
      service.Object.MethodA(); 
     } 
    } 

    public static void MethodB() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceB>()) 
     { 
      service.Object.MethodB(); 
     } 
    } 

    public static void MethodC() 
    { 
     using (var service = IocManager.Instance.ResolveAsDisposable<IServiceC>()) 
     { 
      service.Object.MethodC(); 
     } 
    } 
} 

जैसा कि आप देख सकते हैं, मेरे पास तीन विधियां हैं। MethodA, MethodB, और MethodC कि तीन अलग-अलग इंटरफेस IServiceA, IServiceB साथ अनुरूप है, और IServiceC

कारण मैं यह कर रहा हूँ क्योंकि मैं aspnetboilerplate ढांचे के साथ और Hangfire में Hangfire.io उपयोग कर रहा हूँ, एक पृष्ठभूमि कार्य HttpContext नहीं है सामान्य निर्भरता इंजेक्शन से। एक स्थिर वर्ग बनाना जो मेरी कॉल को लपेटता है जहां मैं मैन्युअल रूप से हल करता हूं, इस बारे में लगता है।

प्रयोग इस तरह दिखता है:

BackgroundJob.Enqueue(() => BackgroundTaskExecuter.MethodA()); 

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

क्या ऐसा करने का कोई बेहतर तरीका है/इसे पुनः प्रतिक्रिया दें? एक कारखाना पैटर्न या ऐसा कुछ भी शायद?

धन्यवाद।

+1

@RuneFS उदाहरण/hypothetical/MCVE कोड [codereview.se] पर ऑफ-विषय है। कृपया [SO उपयोगकर्ताओं के लिए कोड समीक्षा के लिए एक मार्गदर्शिका] देखें (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users)। –

+0

मैं तर्क दूंगा कि यह प्रश्न वास्तव में सहायता केंद्र में परिभाषित दायरे का पालन करता है। –

उत्तर

6

मैं स्थिर रैपर जेनेरिक और सरल बना दूंगा। इसे एक ऐसी विधि का पर्दाफाश करने दें जो सेवा को हल करता है और using कथन के माध्यम से इसे उपभोग करता है, जिससे कॉलर Action<T> में उत्तीर्ण उदाहरण का आह्वान करने की अनुमति देता है।

स्रोत

public static class BackgroundTaskExecuter 
{ 
    public static void ResolveAndConsume<T>(Action<T> consumeService) 
    { 
     // Consider applying constraint to the <T> to 
     // match the constraint of ResolveAsDisposable<T> 
     using (var service = IocManager.Instance.ResolveAsDisposable<T>()) 
     { 
      consumeService(service); 
     } 
    } 
} 

उदाहरण प्रयोग

BackgroundJob.Enqueue(() => 
    BackgroundTaskExecuter.ResolveAndConsume<IServiceA>(serviceA => serviceA.MethodA())); 

आप ऊपर तो हल करने और सेवा के एक कार्यान्वयन उपभोग करते हैं और के रूप में वांछित अपनी कार्यक्षमता के साथ कह सकते हैं।

+1

सवाल यह है कि उन सभी सेवाओं में एक आम इंटरफ़ेस है जो मुझे लगता है लेकिन –

+1

का कोई संकेत नहीं है, मैंने एक धारणा की है कि 'टी' में' IService' की बाधा होगी, लेकिन यह आवश्यक नहीं है। इसे केवल 'ResolveAsDisposable ' विधि की बाधा का पालन करना चाहिए। –

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

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