2015-10-14 11 views
17

में ऐप, सेवाओं और मिडलवेयर के बीच अंतर मैं एमवीसी 6 में मिडलवेयर की अवधारणा को समझने की कोशिश कर रहा हूं। यह अभी भी मेरे लिए अस्पष्ट है। मुझे Startup कक्षा में मिलने वाले कुछ "मानक" चर के बीच मतभेद वास्तव में दिखाई नहीं देते हैं।एमवीसी 6

जहां तक ​​मैं कह सकता हूं कि आवेदन को बताने के 3 अलग-अलग तरीके हैं कि इसे एक विशिष्ट मिडलवेयर का उपयोग करना चाहिए?

आप सेवाओं का उपयोग करके मिडलवेयर को कॉल कर सकते हैं। लेकिन यह केवल मिडलवेयर "जोड़ने" के लिए लगता है?

services.AddMvc(); 

// Add other services 
services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
services.AddScoped<IEmailer, Emailer>(); 

तब आपके पास IApplicationBuilder app है। यह वास्तव में सेवाओं में लोड किए गए मिडलवेयर का उपयोग करना है? तो आप इसे पसंद कॉल कर सकते हैं:

app.UseMvc(); 
app.UseErrorPage(...); 
app.UseIdentity(); // cookie authentication 

और फिर वहाँ लोड करने के लिए एक तरह से और इस तरह उपयोग मिडलवेयर है:

app.UseMiddleware<MyCustomMiddleware>(); 

क्या के तीन प्रकार के होने लाभ का उपयोग कर/दर्ज की है मिडलवेयर? उनके बीच सटीक अंतर क्या है?

उत्तर

12

मैं सेवाओं को जोड़ने और मिडलवेयर जोड़ने के बीच अंतर होता है।

सेवाओं

यह मूलतः निर्भरता इंजेक्शन एएसपी नेट 5. (IServiceCollection इंटरफेस)

सबसे सरल बात आप कर सकते हैं में बनाया कंटेनर में अपनी सुविधा के लिए आवश्यक वर्गों दर्ज की है जोड़ा जा रहा है उन्हें मैन्युअल रूप से के रूप में एक के बाद एक जोड़ने है कार्य करें:

services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
services.AddScoped<IEmailer, Emailer>(); 

आप एक अधिक जटिल अनुप्रयोग का निर्माण कर रहे हैं या एक आत्म निहित ढांचे, आप एक बनाने के लिए चाहते हो सकता है, तो फ़ंक्शन जो आवश्यक सभी सेवाओं को पंजीकृत करता है।कि ऐसा करने का एक अच्छा तरीका है एक विस्तार विधि बनाने के द्वारा है:

public static void AddMyServices(this IServiceCollection services) 
{ 
    services.AddScoped<IMyCountriesRepository, MyCountriesRepository>(); 
    services.AddScoped<IEmailer, Emailer>(); 
    ... 
} 

//register all your services just by running the ext method: 
services.AddMyServices(); 

है यही तो services.AddMvc(); कर रही है।

एक और अधिक लचीला तरह से यह आप आगे मॉडल बाइंडरों की तरह डिफ़ॉल्ट सेवाएं (जैसा services.AddMvc(opts => opts.ModelBinders ...)) अनुकूलित करने के लिए एक लैम्ब्डा पारित करने के लिए अनुमति देता है और एक IMvcBuilder आप आगे यह दृश्य इंजन की तरह बातें (अनुकूलित करने के लिए उपयोग कर सकते हैं लौटा रहा है के रूप में services.AddMvc().AddViewOptions(opts => opts.ViewEngines ...) की तरह)।

मिडलवेयर

एएसपी नेट 5 जोड़ना HTTP मॉड्यूल और संचालकों में स्थित नहीं है, और बदले Owin विचार पर आधारित है मिडलवेयर का घटक है कि एक सर्वर और आवेदन का निरीक्षण करने, मार्ग के बीच एक पाइप लाइन के रूप में पार करें -

मिडिलवेयर: वहाँ एक [अच्छा ब्लॉग प्रविष्टि] (http://dzimchuk.net/post/understanding-aspnet-5-middleware) द्वारा आंद्रेई Dzimchuk मिडलवेयर जो अच्छी तरह से सारांशित करता है यह वर्णन है , या एक विशिष्ट उद्देश्य के लिए अनुरोध और प्रतिक्रिया संदेश संशोधित करें।

और यह परिभाषा एएसपी.नेट 5 पर भी लागू होती है। मिडलवेयर क्लासिक एएसपी.नेट में हमारे पास HTTP मॉड्यूल और हैंडलर दोनों के रूप में सोचा जा सकता है। प्रमाणन, सत्र राज्य पुनर्प्राप्ति और दृढ़ता, लॉगिंग आदि जैसे अनुरोधों को संसाधित करते समय कुछ मध्यवर्ती विभिन्न मध्यवर्ती कार्यों को लागू करेंगे। उनमें से कुछ अंतिम अनुरोध हैंडलर होंगे जो प्रतिक्रियाएं उत्पन्न करेंगे।

तो अब आप एएसपी पाइपलाइन में अपना व्यवहार जोड़ना चाहते हैं।

app.Use(async (context, next) => 
{ 
    //do something before passing the request to the next middleware 
    await next.Invoke(); 
}); 

तुम भी create your own middleware class और यह रजिस्टर कर सकते हैं:

app.UseMiddleware<MyMiddleware>(); 

अंत में, आप फिर से जटिल सेटअप तर्क संपुटित करने के लिए विस्तार के तरीकों को परिभाषित कर सकता है

सबसे सरल बात एक इनलाइन मिडलवेयर को परिभाषित है।

यह app.UseMvc() करता है। यह आपको अपने मार्गों को परिभाषित करने देता है और फिर app.UseRouter() पर कॉल करके रूटिंग मिडलवेयर जोड़ रहा है। आप देख सकते हैं, app.UseRouter के कार्यान्वयन builder.UseMiddleware<RouterMiddleware>(router);

करने के लिए कॉल के साथ पाइप लाइन में RouterMiddleware कहते हैं आपके मिडलवेयर द्वारा आवश्यक किसी भी सेवाओं होगा पहले से पंजीकृत किया गया है। इसका मतलब है कि वे डीआई कंटेनर में निर्मित के माध्यम से आपके मिडलवेयर पर उपलब्ध होंगे।


अंतिम परिणाम है कि ढांचा आसान बना देता है आप मूल रूप से मिश्रण करने के लिए और से मेल घटकों (सेवा) और व्यवहार (मिडल वेयर) आपके आवेदन की जरूरत है, केवल बिट्स कि आप की आवश्यकता भी शामिल है।

+0

लिंक बहुत मददगार था, धन्यवाद – wodzu

2

पाइप लाइन के निर्माण के दो चरणों के होते हैं:

  • डि
  • के लिए सेवाओं का पंजीयन पाइपलाइन

AddMvc को मिडलवेयर जोड़ना सेवाओं है कि MVC (जैसे, देखने की जरूरत पंजीकृत करता है इंजन, जेएसओएन फॉर्मेटर, आदि) लेकिन पाइपलाइन में कुछ भी नहीं जोड़ता है।

UseMiddleware<T> पाइपलाइन पर मिडलवेयर जोड़ने के लिए एक सामान्य विधि है। यह विधि डीआई सिस्टम का उपयोग मिडलवेयर क्लास के कन्स्ट्रक्टर के माध्यम से निर्भरता इंजेक्ट करने के लिए करेगी।

UseMvc और जैसे एक्सटेंशन विधियां हैं जो कॉन्फ़िगरेशन विकल्पों में पास करना आसान बनाता है। यदि आप कस्टम मिडलवेयर लिखते हैं, तो आप मिडलवेयर सेट अप करने की आवश्यकता के आधार पर UseMiddleware<T> पर कॉल कर सकते हैं या एक विस्तार विधि प्रदान कर सकते हैं।

आप और अधिक जानकारी यहाँ पा सकते हैं: https://docs.asp.net/en/latest/fundamentals/middleware.html

7

मैं डैनियल को एक व्यावहारिक उदाहरण में जोड़ना चाहता हूं। (उसका जवाब बहुत विस्तृत और सही है, इसे पहले देखें)।

टी एल; डॉ:

services.Add सीधे मिडलवेयर से संबंधित नहीं है। यह निर्भरता इंजेक्शन कंटेनर में निर्भरताओं को पंजीकृत करने के बारे में है।

app.Use चेरी चुनने के बारे में है कि कौन सा कोड पाइपलाइन (लॉजिक) में चलाएगा, जिसमें ऑर्डर होता है, और यदि पाइपलाइन को प्रसंस्करण जारी रखने की अनुमति मिलती है या नहीं। कल्पना यहाँ सीमा है, एक उदाहरण एक मिडलवेयर कि आईपी पता के आधार पर, आप एक पृष्ठ दिखा सकते हैं कि कहते हैं writting किया जाएगा:) 'खेद सेवा आपके देश में उपलब्ध नहीं है'

app.UseMiddleware यह app.Use की तरह ही है लेकिन कोड इनलाइन घोषित करने के बजाय, आप एक कक्षा निर्दिष्ट करते हैं जिसमें एक Invoke विधि होगी जिसे आपके लिए बुलाया जाएगा।

अब, चलो कुछ नमूना कोड के लिए मिलता है:

मान लीजिए कि आप अपने HTML minifing की तरह अपने उत्पादन या अपने उत्पादन में से कुछ, कार्रवाई करने के लिए अपने आवेदन चाहते हैं।

आप एक मिडलवेयर कि प्रतिक्रिया से पहले उत्पादन के लिए लिखा है को बीच में रोक जोड़ने और इसे कम करें कर सकते हैं।

तो आप का उपयोग कर सकते हैं:

app.Use(async (context, next) => 
{ 
    await next(context); 
    context.Response // will have the response as processed by all the previous middleswares like mvc. 
    if IsMinifiable(context.Response) 
    MinifyResponse(context.Response); 

}); 

आप विभिन्न अनुप्रयोगों में या दूसरों के द्वारा अपने मिडलवेयर साझा करना चाहते हैं, तो आप एक मध्यस्थ बना सकते हैं और उपयोग कर सकते हैं इसे और अधिक की तरह:

app.UseMiddleware<HtmlMinifierMiddleware>(); 

यह कॉन्फ़िगरेशन विधि में कोड की एक पंक्ति के साथ आपके लिए सभी काम करेगा। यह app.UseHtmlMinifier() की तरह विस्तार तरीकों जहाज और विशिष्ट वस्तुओं है कि विन्यास या समर्थन कॉन्फ़िगरेशन पैरामीटर के लिए श्रृंखलित जा सकती है, वापस जाने के लिए आम बात है। एक्सटेंशन देता है का उपयोग करते हुए लचीलापन, पठनीयता और एपीआई खोज क्षमता का एक बहुत: डी

अब मान लें कि आपकी मिडलवेयर कुछ इस तरह delcared है:

public class HtmlMinifierMiddleware { 
    public HtmlMinifier(IHtmlMinifier minifier) { 
     // ... 
    } 
    public string Minify(string content) { 
     return minifier.Minify(content); 
    } 
    // ... 
} 

के रूप में आप देख सकते हैं, तो आप एक IHtmlMinifer उत्तीर्ण करने की आवश्यकता है, तो आप की जरूरत है DI के लिए इसे पंजीकृत करने के लिए।

services.AddScoped<IHtmlMinifier, MyCoolHtmlMinifier>(); 

अब कल्पना करें कि आप 1 की जरूरत नहीं है, लेकिन कई निर्भरता, यह मिडलवेयर के विकासकर्ता/उपभोक्ता हर एक निर्भरता है कि होने की जरूरत है पता करने के लिए अप करने के लिए किया जाएगा:

इस तरह ConfigureService पर पूरा किया है दर्ज कराई।

मिडलवेयर के लेखक आमतौर पर डेवलपर्स के उपयोग को कम करने के लिए एक विस्तार करते हैं जैसे: services.AddHtmlMinifier() जो कि डी कंटेनर में पंजीकरण सेवाओं के लिए एक विस्तार विधि है।

भले ही आप मिडलवेयर का उपयोग नहीं कर रहे हैं, आप उसी पैटर्न का उपयोग करके अपने स्वयं के आवेदन की निर्भरता का लाभ उठा सकते हैं।

उदाहरण के लिए, यदि आपके ऐप एक ई-कॉमर्स है, तो आप विस्तार तरीकों कि अपनी निर्भरता रजिस्टर बना सकते हैं: services.AddProductManagement(), services.AddPriceCalculator(), services.AddSearching(), आदि, या बस services.AddMyCoolApplication() जोड़ने के लिए एक साफ रास्ता प्रदान करने के लिए (पंजीकरण के) अपनी सेवाओं (निर्भरता) आपके आवेदन के लिए डी कंटेनर द्वारा पाया जा सकता है।

+1

बहुत उपयोगी, धन्यवाद। – wodzu

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