2011-07-06 10 views
20

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

क्या अंदर और एएसपी नेट एमवीसी ऐप से विस्तार विधियों में इंटरफेस इंजेक्ट करने का कोई तरीका है?

अद्यतन

मैं क्या मदद कर सकता है कर रहा हूँ का एक उदाहरण:

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     var service = ObjectFactory.GetInstance<IPerformanceService>(); 

     var showName = service.GetPerformanceTitle(showId); 

     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

कौन इस तरह प्रयोग किया जाता है:

<a href='<%= Url.ForShow(1)%>'> 

अनिवार्य रूप से मैं एक यूआरएल का निर्माण करने की कोशिश कर रहा हूँ एक इकाई आईडी से एक स्लग के साथ। हो सकता है कि मैं बस इस बारे में वास्तव में एक कठिन तरीके से जा रहा हूं।

+0

आप MVC DependencyResolver का उपयोग कर रहे हैं? – mccow002

उत्तर

6

एक विस्तार विधि में निर्भरताओं को इंजेक्ट करने का कोई तरीका नहीं है।

एएसपी.नेट एमवीसी हेल्पर्स के लिए, आपको कुछ प्रकार की सेवा स्थान करना होगा - चाहे आप किसी प्रकार के अमूर्तता के साथ दफन कर रहे हों।

+3

आप निर्भरता को विधि तर्क (विधि इंजेक्शन) के रूप में पारित करके, एक विस्तार विधि में निर्भरता इंजेक्ट कर सकते हैं। हालांकि यह वास्तव में सुविधाजनक नहीं है, खासकर जब आपको कई निर्भरताओं में पारित करने की आवश्यकता होती है। – Steven

+1

अच्छा बिंदु। मैंने मूल रूप से कुछ डेमो कोड को बिल्कुल दिखाने के लिए शामिल किया था, लेकिन महसूस किया कि अंतिम परिणाम कोई सुंदर नहीं था। –

21

मैं ऐसा करने की अनुशंसा नहीं करता। एक्सटेंशन विधियों का आमतौर पर सरल, जाने-माने संचालन के लिए आमतौर पर एक प्रकार पर उपयोग किया जाता है। यदि आपकी विस्तार विधि किसी अन्य प्रकार का उदाहरण होने पर निर्भर है, तो संभवतः यह शुरू होने के लिए एक विस्तार विधि नहीं होनी चाहिए।

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

कुछ कोड साझा करना आपकी विशिष्ट स्थिति पर अधिक प्रकाश डाल सकता है।

6

आपको सीधे अपनी विस्तार विधि में structmap को कॉल नहीं करना चाहिए।

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     //Use the MVC DependencyResolver NOT Structuremap directly (DependencyResolver is using structuremap) 
     return url.ForShow(showId, DependencyResolver.Current.GetService<IPerformanceService>()) 
    } 

    //For Unit Testing 
    public static string ForShow(this UrlHelper url, int showId, IPerformanceService performanceService) 
    { 
     var showName = performanceService.GetPerformanceTitle(showId); 
     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

अब आप अपने इकाई परीक्षण विधि में IPerformanceService का एक ठोस कार्यान्वयन में पारित कर सकते हैं: इसके अलावा, आप एक परीक्षण योग्य संस्करण है कि नीचे की तरह एक IPerformanceService तर्क लेता बनाना चाहिए। UrlHelper मजाक पर

Assert.Equal("TheUrl", url.ForShow(8, new PerformanceService()); 

और जानकारी: ASP.NET MVC: Unit testing controllers that use UrlHelper

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