2009-08-18 19 views
6

में एक अधिकृत विशेषता के लिए भंडार में कैसे पास करूं? मैं महल विंडसर हूं और यह उपयोग किए जा रहे भंडार में गुजरने में नियंत्रक रचनाकारों के लिए बहुत अच्छा काम करता है।मैं एएसपी.नेट एमवीसी

private IStoryRepository Repository; 
public StoryController(IStoryRepository Repository) 
{ 
    this.Repository = Repository;     
} 

अब मेरे पास एक एक्शन है जो मुख्य व्यवस्थापक मेनू को प्रदर्शित करने के लिए व्यवस्थापक क्षेत्र में है। मैं एक कस्टम प्राधिकरण विशेषता है जो सिर्फ जाँच करेगा कि उपयोगकर्ता के लॉग इन एक व्यवस्थापक (सिर्फ उन तालिका में एक isAdmin ध्वज)

[AdminAuthorize] 
public ActionResult Menu() 

private IStoryRepository Repository; 
/// <summary> 
/// Initializes a new instance of the <see cref="AdminAuthorizeAttribute"/> class. 
/// </summary> 
public AdminAuthorizeAttribute(IStoryRepository Repository) 
{ 
    this.Repository = Repository; 
} 

/// <summary> 
/// Checks if the user is authorised 
/// </summary> 
/// <param name="httpContext">The HTTP context.</param> 
/// <returns> 
/// <c>true</c> if authorized; otherwise, <c>false</c>. 
/// </returns> 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    return this.Repository.UserIsAdmin(httpContext.User.Identity.Name); 
} 

है का इस्तेमाल किया है मैं कैसे प्राप्त कर सकते हैं कैसल ऐसा विशेषता निर्माता में भंडार पारित करने के लिए एक नियंत्रक कन्स्ट्रक्टर के लिए करता है?

उत्तर

1

आपके मूल रूप से दो विकल्प हैं। प्रॉक्सी में फ़िल्टर लपेटें, इसका एक अच्छा उदाहरण here पाया जा सकता है।

या, अपने कस्टम फ़िल्टर के भीतर आप एक स्पष्ट कंटेनर कॉल कर सकते हैं। StructureMap का उपयोग कर उदाहरण के लिए

ObjectFactory.GetInstance(IStoryRepository) 

एक तिहाई रास्ता ActionInvoker इंजेक्शन करने के लिए विस्तार करने के लिए है जो हो सकता है, लेकिन मुझे यकीन है कि यह कैसे किया जा होगा नहीं कर रहा हूँ (मैं नहीं इस्तेमाल किया महल बड़े पैमाने पर है)।

0

मैं FluentMVC प्रोजेक्ट को देखकर लायक हो सकता हूं। यह आपको स्टार्टअप पर विशेषताओं को कॉन्फ़िगर करने की अनुमति देता है और क्योंकि यह हुड के नीचे विंडसर का उपयोग करता है, इसे आसानी से इंजेक्शन इंजेक्शन देने की अनुमति देनी चाहिए। उदाहरण

FluentMvcConfiguration.Configure = x => { 
           x.UsingControllerFactory(new WindsorControllerFactory());                x.WithFilter<HandleErrorAttribute>(); 
           x.WithFilter<AuthorizeAttribute>(
            Except 
             .For<AccountController>(ac => ac.LogOn()) 
             .AndFor<AccountController>(ac => ac.LogOn(null, null, false, null)) 
             .AndFor<HomeController>()); 
          }; 

कोड ऊपर लॉग इन के अलावा सभी कार्यों और घर नियंत्रक

सुनिश्चित नहीं हैं कि परियोजना की वर्तमान स्थिति है, लेकिन यह कुछ समय के लिए इस्तेमाल किया और है है के लिए AuthorizeAttribute जोड़ देगा के लिए बहुत अच्छी तरह से काम करता है मेरे लिए।

0

समस्या यह है कि विशेषताएं कॉल के बजाय प्रतिबिंब द्वारा बनाई गई हैं जिन्हें अवरुद्ध किया जा सकता है और कंटेनर को प्रतिनिधि कॉल के साथ प्रतिस्थापित किया जा सकता है।

ऐसे कई दृष्टिकोण हैं जिनका उपयोग डीआई का समर्थन करने वाले फ़िल्टर बनाने के लिए किया जा सकता है, सबसे आसान आईएमएचओ एक्शन इनवॉकर का विस्तार करना और गेटफिल्टर को ओवरराइड करना है, जो एक प्रकार का कार्यान्वयन प्रदान करता है जो फिल्टर प्रकार निर्धारित करने के लिए विशेषता का उपयोग करता है और फिर उस प्रकार को हल करता है कंटेनर से। इस दृष्टिकोण का कार्यान्वयन एमवीसी टर्बाइन (http://mvcturbine.codeplex.com/sourcecontrol/changeset/view/37298?projectName=mvcturbine#758440) में देखा जा सकता है।

0

फ़िल्टर कन्स्ट्रक्टर के अंदर एक स्थैतिक फैक्ट्री विधि से आपको आईआरपीपॉजिटरी ऑब्जेक्ट क्यों नहीं मिलता है? डीआई को अपना काम करने की अनुमति देने के लिए आप फैक्ट्री विधि का उपयोग करते हैं।

DI मानक "कन्स्ट्रक्टर पैरामीटर" दृष्टिकोण के बजाय आपके "गेटवे" विधि पर काम करेगा।

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