2016-08-01 23 views
8

में कन्स्ट्रक्टर पैरामीटर के साथ निर्भरता इंजेक्शन। मैं .NET कोर में DI का उपयोग करने के तरीके पर बहुत से कोड उदाहरण देखता हूं, हालांकि उनमें से कोई भी कन्स्ट्रक्टर पैरामीटर का उपयोग नहीं करता है।.net कोर

उदाहरण के लिए:

  • प्राधिकरण सेवा बनाएं
  • निर्माता
  • में वर्तमान HTTP हेडर (एक्स-एपीआई कुंजी) सम्मिलित करें कार्यान्वयन की जांच में अगर मैं पहुँच

है यहां मुझे केवल IAuthorizationService पर DI का उपयोग करने की आवश्यकता नहीं है बल्कि कन्स्ट्रक्टर में टोकन इंजेक्ट करने की आवश्यकता है। मुझे पता है कि निनजेक्ट में इसे कैसे किया जाए, हालांकि .NET कोर DI में कोई अनुभव नहीं है।

यहां मेरे उदाहरण के रूप में है।

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddEntityFrameworkSqlite(); 
    services.AddDbContext<MainDbContext>(); 
    services.AddScoped<IAuthorizationService, AuthorizationService>(); // Inject current HttpContext header value as a constructor? 
} 
+0

[आप इस दस्तावेज़ को देखा है] (https://docs.asp.net/en/latest/fundamentals/dependency:

जब सही ढंग से कॉन्फ़िगर है, हम नियंत्रकों या सेवाओं में ApiKeyAccessor उदाहरण इंजेक्षन कर सकते हैं -injection.html) –

+0

क्या आपको टोकन इंजेक्ट करने की आवश्यकता है, या क्या आप टोकन प्रदान करने वाली कक्षा के लिए इंटरफ़ेस इंजेक्ट कर सकते हैं? –

+0

@ स्कॉटहैनेन एचएम, मुझे लगता है कि वास्तव में कोई फर्क नहीं पड़ता। हालांकि टोकन बेहतर होगा क्योंकि टेस्टेबिलिटी तब आसान होगी। – sed

उत्तर

6

मैं आमतौर पर ऐसी सेवाओं के माध्यम से ऐसे मूल्यों का प्रवाह करता हूं जहां डेटा मिडलवेयर के टुकड़े में सेट होता है। उदाहरण के लिए:

एक्सेसर वर्ग जो इंजेक्ट किया जा सकता:

public class ApiKeyAccessor 
{ 
    public string ApiKey { get; set; } 
} 

और एक मध्यस्थ जो अनुरोध की शुरुआत में API कुंजी सेट:

public class ApiKeyMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public ApiKeyMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public Task Invoke(HttpContext context, ApiKeyAccessor apiKeyAccessor) 
    { 
     StringValues key; 
     if (context.Request.Headers.TryGetValue("X-Api-Key", out key)) 
     { 
      apiKeyAccessor.ApiKey = key; 
      return _next(context); 
     } 

     // todo: throw exception, etc.. 
    } 
} 

अब सभी हम है करने के लिए है को स्किप्ड जीवनकाल के साथ डी कंटेनर में जोड़ें और अनुरोध निष्पादन पाइपलाइन को ApiKeyMiddleware जोड़ें, अधिमानतः जितनी जल्दी हो सके।

public class AuthorizationService 
{ 
    private readonly string _apiKey; 

    public AuthorizationService(ApiKeyAccessor apiKeyAccessor) 
    { 
     _apiKey = apiKeyAccessor.ApiKey; 
    } 
} 
+1

मुझे यह पसंद है - एक वर्ग इंजेक्शन - एक मूल्य इंजेक्शन से अधिक जब तक कि मान कनेक्शन स्ट्रिंग की तरह अपरिवर्तित न हो। किसी भी दिए गए डी कंटेनर के साथ रनटाइम पर एक मान पुनर्प्राप्त करने के लिए कंटेनर को कॉन्फ़िगर करने के बजाय कक्षा को इंजेक्ट करना आमतौर पर आसान होता है। –