2009-02-16 9 views
17

कैसे NInject can do it और AutoFac can do it मैं यह पता लगाने की कैसे महल विंडसरमैं विंडसर का उपयोग कैसे करूँ ActionFilterAttributes

का उपयोग कर इस समय मैं एक बदसूरत स्थिर उपयोग कर रहा हूँ MVC ActionFilters में निर्भरता इंजेक्षन कोशिश कर रहा हूँ देखने के बाद में निर्भरता सुई आईओसी सहायक वर्ग इस तरह निर्माता कोड से निर्भरता को हल करने:

public class MyFilterAttribute : ActionFilterAttribute 
{  
    private readonly IUserRepository _userRepository; 
    public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { } 
    public MyFilterAttribute(IUserRepository userRepository) 
    { 
    _userRepository = userRepository; 
    } 
} 

मैं अपने फिल्टर से है कि स्थिर antipattern आईओसी बात को दूर करने में खुशी होगी।

कैसल विंडसर के साथ ऐसा करने के बारे में मुझे कोई संकेत मिलेगा?

और नहीं, डी फ्रेमवर्क बदलना एक विकल्प नहीं है।

public class MyFilterAttribute : ActionFilterAttribute { 
    public MyFilterAttribute(Type serviceType) { 
     this.serviceType = serviceType; 
    } 

    public override void OnActionExecuting(FilterExecutingContext c) { 
     Container.Resolve<IFilterService>(serviceType).OnActionExecuting(c); 
     // alternatively swap c with some context defined by you 
    } 

    // (...) action executed implemented analogously 

    public Type ServiceType { get { return serviceType; } } 
    public IWindsorContainer Container { set; get; } 
} 

फिर आदेश का नियंत्रण लेने के लिए, दो लेख आप की बात कर रहे रूप में एक ही दृष्टिकोण का उपयोग: - यानी कुछ इस तरह MyFilterAttribute ctor साथ तर्क के रूप में एक प्रकार ले जा रहा:

उत्तर

10

एक सामान्य विशेषता बनाओ क्रियाएं कैसे लागू की जाती हैं, और विशेषता में अपने विंडसर कॉन्टैनेर का मैन्युअल इंजेक्शन करें।

उपयोग: [MyFilter (typeof (IMyFilterService))]

आपका वास्तविक फिल्टर तो एक वर्ग IMyFilterService को लागू करने में हो जाएगा बारी IFilterService को लागू करना चाहिए में कुछ इस तरह दिखाई दे सकता है जो जो:

public interface IFilterService { 
    void ActionExecuting(ActionExecutingContext c); 
    void ActionExecuted(ActionExecutedContext c); 
} 

इस प्रकार आपका फ़िल्टर एएसपी.नेट एमवीसी से भी बंधे नहीं होगा, और आपकी विशेषता केवल मेटाडाटा का एक टुकड़ा है - जिस तरह से इसे वास्तव में माना जाता है! :-)

+2

मैं सहमत हूं: विशेषताओं को "निष्पादन योग्य" नहीं होना चाहिए बल्कि सिर्फ एक टैग होना चाहिए। –

+2

आपके उत्तर के लिए बहुत बहुत धन्यवाद! मैं कुछ mods के साथ चल रहा है: 1) कंटेनर। रेखा रेखा को एक सामान्य पैरामीटर की आवश्यकता है। मैंने इसे कंटेनर का उपयोग करने के लिए बदल दिया। रिसोल्व (सर्विस टाइप) और इसे कास्ट करें। 2) मैंने mvccontrib WindsorControllerFactory विरासत में मिला और CreateController() में ActionInvoker जोड़ा। –

18

जब मुझे इसकी आवश्यकता थी, तो मैंने property injection dependencies on my ActionFilters प्राप्त करने के लिए दूसरों ने निनजेक्ट और विंडसर के साथ किए गए काम पर बनाया।

+3

मैंने उस लिंक पर विधि को भी पसंद किया। –

+0

अच्छा पोस्ट धन्यवाद! मुझे यह बहुत जल्दी काम कर रहा है और जेनेरिक MyFilterAttribute विकल्प से उपयोग बहुत अच्छा है –

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