2016-07-20 10 views
5

मैं उन वस्तुओं में मौजूदा प्रिंसिपल को इंजेक्ट करने के लिए ऑटोफ़ैक का उपयोग करना चाहता हूं। मान लीजिए मेरे पास एक ऑब्जेक्ट है (AuthorizationValidator) जो सुरक्षा जांच कर रहा है। अपने वेब आवेदन AuthorizationValidator पंजीकृत किया गया है के लिएऑटोफ़ैक: NULL मानों को इंजेक्ट करें

public AuthorizationValidator : IAuthorizationValidator 
{ 
    public AuthorizationValidator(IDataAccess dataAccess, IPrincipal principal) 
    { 
    // Save injected objects 
    ... 
    } 

    public bool CheckPermission(Guid objectId, Action action) 
    { 
    // Check if we are authorized at all 
    if (this.principal == null) 
     return false; 

    // Check the permission in the database 
    ... 
    } 
} 

और मैं निम्नलिखित पंजीकरण का उपयोग प्रिंसिपल सुई:: यह कुछ इस तरह दिखता धागा के प्रमुख या कुछ इसी तरह

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User); 

आवेदनों की अन्य प्रकार का उपयोग करें । प्रिंसिपल की आवश्यकता वाले सभी ऑब्जेक्ट को उचित प्रिंसिपल इंजेक्शन मिलता है।

यदि कोई कॉल प्राधिकरण के बिना किया जाता है, तो ऑटोफैक मुझे एक अपवाद उठाता है कि यह IPrincipal ऑब्जेक्ट प्रदान नहीं कर सकता है, क्योंकि कारखाना null लौटाया गया है। इस मामले में, एक खाली प्रिंसिपल ठीक है और अपवाद नहीं उठाया जाना चाहिए। ASP.NET अनुप्रयोग मैं IPrincipalFactory के रूप में निम्नलिखित वस्तु रजिस्टर होगा के लिए

public AuthorizationValidator : IAuthorizationValidator 
{ 
    public AuthorizationValidator(IDataAccess dataAccess, IPrincipalFactory principalFactory) 
    { 
    // Save injected objects 
    _dataAccess = dataAccess; 
    _principal = principalFactory.GetCurrentPrincipal(); 
    } 

    public bool CheckPermission(Guid objectId, Action action) 
    { 
    // Same as previous example 
    ... 
    } 
} 

public interface IPrincipalFactory 
{ 
    IPrincipal GetCurrentPrincipal(); 
} 

:

+0

मुझे नहीं पता कि ऑटोफैक के अंदर क्या है, लेकिन यह एक मौका है कि यह काम कर सकता है: 'बिल्डर। रजिस्ट्रार ((सी, पी) => (आईपीआर प्रिंसिपल) एचटीपी कोंटेक्स्ट.कुरेंट? यूसर); ' –

+0

आम तौर पर बोलते हुए, आईओसी ढांचे आपको जानबूझकर शून्य से इंजेक्ट नहीं करने देंगे। यह सिर्फ एक ऑटोफैक चीज नहीं है। –

+0

क्या [नल ऑब्जेक्ट पैटर्न] (https://en.wikipedia.org/wiki/Null_Object_pattern) एक विकल्प होगा जैसा मैंने अपने उत्तर में सुझाया है? – fknx

उत्तर

5

ऑटोफैक documentation में वे ऐसे परिदृश्यों के लिए Null Object pattern का उपयोग करने की सलाह देते हैं। आप एक NullPrincipal वर्ग बना सकते हैं जो IPrincipal इंटरफ़ेस से एक निजी कन्स्ट्रक्टर के साथ प्राप्त होता है जो केवल readonlystatic फ़ील्ड का खुलासा करता है जो डिफ़ॉल्ट उदाहरण प्रदान करता है। तो फिर तुम इस उदाहरण के बजाय लौट सकते हैं अशक्त की:

builder.Register<IPrincipal>((c, p) => HttpContext.Current?.User ?? NullPrincipal.Default); 

बेशक आप अगर यह बजाय NullPrincipal.Default के बराबर है अपने कोड में सभी स्थानों पर जहां आप जाँच कर रहे हैं अद्यतन करता है, तो प्रिंसिपल रिक्त है और जांच करने के लिए होगा।

1

इस समस्या को हल करने के लिए, मैं IPrincipalFactory इंटरफ़ेस AutoFac माध्यम से जा रहा बिना वर्तमान प्रिंसिपल प्राप्त कर सकते हैं बनाया है

public class IAspNetPrincipalFactory : IPrincipalFactory 
{ 
    public IPrincipal GetCurrentPrincipal() => HttpContext.Current?.User; 
} 

हालांकि यह काम करता है, मैं इस समाधान से पूरी तरह से खुश नहीं हूं।

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