AddTransient, AddScoped और AddSingleton Services अंतर


935

मैं ASP.NET कोर में निर्भरता इंजेक्शन (DI) को लागू करना चाहता हूं । इसलिए इस कोड को ConfigureServicesविधि में जोड़ने के बाद , दोनों तरीके काम करते हैं।

ASP.NET Core में services.AddTransientऔर service.AddScopedविधियों में क्या अंतर है ?

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.

    // Add application services.
    services.AddTransient<IEmailSender, AuthMessageSender>();
    services.AddScoped<IEmailSender, AuthMessageSender>();
}

92
@tmg डॉक्स का कहना है कि 'जब भी उनसे अनुरोध किया जाता है, तो क्षणिक जीवन भर की सेवाएं बनाई जाती हैं।' और 'स्कोप की गई आजीवन सेवाएं अनुरोध के अनुसार एक बार बनाई जाती हैं।' जब तक कि अंग्रेजी की मेरी समझ कमजोर नहीं होती, मुझे लगता है कि वास्तव में इसका मतलब वही है।
न्यूट्रिनो

70
@tmg मुझे पता है। मैं सिर्फ यह इंगित कर रहा हूं कि डॉक्स इस बिंदु पर बिल्कुल स्पष्ट नहीं हैं, इसलिए डॉक्स के लिए लोगों को इंगित करना बहुत मददगार नहीं है।
न्यूट्रिनो

13
@ न्यूट्रीनो, यही कारण है कि मैंने यह सवाल पूछा।
एल्विन ममाडोव

5
पार्टी के लिए देर से, टिप्पणियों को बाद में भी पढ़ना, लेकिन मैंने उस लेख को प्रिंट किया, इसे पढ़ा, और मार्जिन में उसी अवलोकन को देखा जो मैंने अब यहां @Nututino बनाया है। उस विश्लेषण की पेशकश में लेख ENTIRELY अस्पष्ट था। उदाहरण, शुक्र है, कम भ्रमित था।
वेलसप्रिंग

5
जहाँ तक मुझे समझ में आता है: क्षणिक आजीवन सेवाएं हर बार अनुरोध करने के बाद बनाई जाती हैं । यहाँ अनुरोध किया गया शब्द रोज़ कुछ माँगने का अंग्रेजी अर्थ है, इस मामले में एक सेवा। शब्द जबकि अनुरोध में एक बार प्रति अनुरोध एक HTTP अनुरोध को दर्शाता है। लेकिन मुझे समझ में नहीं आता है कि क्या है।
मेमट ऑलसेन

जवाबों:


1648

टी एल; डॉ

क्षणिक वस्तुएँ हमेशा अलग होती हैं; प्रत्येक नियंत्रक और हर सेवा को एक नया उदाहरण प्रदान किया जाता है।

स्कोप की गई वस्तुएँ अनुरोध के भीतर समान होती हैं, लेकिन विभिन्न अनुरोधों में भिन्न होती हैं।

सिंगलटन ऑब्जेक्ट्स प्रत्येक ऑब्जेक्ट और हर अनुरोध के लिए समान हैं।

अधिक स्पष्टीकरण के लिए, ASP.NET प्रलेखन से यह उदाहरण अंतर दिखाता है:

इन जीवनकाल और पंजीकरण विकल्पों के बीच अंतर को प्रदर्शित करने के लिए, एक साधारण इंटरफ़ेस पर विचार करें जो एक विशिष्ट पहचानकर्ता के साथ ऑपरेशन के रूप में एक या अधिक कार्यों का प्रतिनिधित्व करता है OperationId। इस सेवा के लिए हम आजीवन कैसे कॉन्फ़िगर करते हैं, इसके आधार पर, कंटेनर अनुरोध वाले वर्ग को सेवा के समान या अलग-अलग उदाहरण प्रदान करेगा। यह स्पष्ट करने के लिए कि किस आजीवन के लिए अनुरोध किया जा रहा है, हम एक प्रकार का प्रति जीवनकाल विकल्प बनाएंगे:

using System;

namespace DependencyInjectionSample.Interfaces
{
    public interface IOperation
    {
        Guid OperationId { get; }
    }

    public interface IOperationTransient : IOperation
    {
    }

    public interface IOperationScoped : IOperation
    {
    }

    public interface IOperationSingleton : IOperation
    {
    }

    public interface IOperationSingletonInstance : IOperation
    {
    }
}

हम एक एकल वर्ग का उपयोग करके इन इंटरफेस को लागू करते हैं Operation, जो इसके निर्माता में एक GUID को स्वीकार करता है, या यदि उपलब्ध कराया जाता है, तो एक नए GUID का उपयोग करता है:

using System;
using DependencyInjectionSample.Interfaces;
namespace DependencyInjectionSample.Classes
{
    public class Operation : IOperationTransient, IOperationScoped, IOperationSingleton, IOperationSingletonInstance
    {
        Guid _guid;
        public Operation() : this(Guid.NewGuid())
        {

        }

        public Operation(Guid guid)
        {
            _guid = guid;
        }

        public Guid OperationId => _guid;
    }
}

अगले, में ConfigureServices, प्रत्येक प्रकार को उसके नामित जीवनकाल के अनुसार कंटेनर में जोड़ा जाता है:

services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
services.AddTransient<OperationService, OperationService>();

ध्यान दें कि IOperationSingletonInstanceसेवा एक ज्ञात आईडी के साथ एक विशिष्ट उदाहरण का उपयोग कर रही है Guid.Empty, इसलिए यह स्पष्ट होगा कि यह प्रकार कब उपयोग में है। हमने एक पंजीकृत भी किया है जो OperationServiceप्रत्येक दूसरे Operationप्रकार पर निर्भर करता है , ताकि यह एक अनुरोध के भीतर स्पष्ट हो जाए कि क्या इस सेवा को प्रत्येक ऑपरेशन प्रकार के लिए नियंत्रक या एक नया एक ही उदाहरण मिल रहा है। यह सब सेवा संपत्तियों के रूप में इसकी निर्भरता को उजागर करती है, इसलिए उन्हें दृश्य में प्रदर्शित किया जा सकता है।

using DependencyInjectionSample.Interfaces;

namespace DependencyInjectionSample.Services
{
    public class OperationService
    {
        public IOperationTransient TransientOperation { get; }
        public IOperationScoped ScopedOperation { get; }
        public IOperationSingleton SingletonOperation { get; }
        public IOperationSingletonInstance SingletonInstanceOperation { get; }

        public OperationService(IOperationTransient transientOperation,
            IOperationScoped scopedOperation,
            IOperationSingleton singletonOperation,
            IOperationSingletonInstance instanceOperation)
        {
            TransientOperation = transientOperation;
            ScopedOperation = scopedOperation;
            SingletonOperation = singletonOperation;
            SingletonInstanceOperation = instanceOperation;
        }
    }
}

अनुप्रयोग के लिए अलग-अलग व्यक्तिगत अनुरोधों के भीतर और बीच में वस्तु जीवनकाल को प्रदर्शित करने के लिए, नमूने में एक OperationsControllerप्रकार का अनुरोध IOperationऔर साथ ही एक शामिल है OperationServiceIndexकार्रवाई तो नियंत्रक और सेवा के के सभी प्रदर्शित करता है OperationIdमान।

using DependencyInjectionSample.Interfaces;
using DependencyInjectionSample.Services;
using Microsoft.AspNetCore.Mvc;

namespace DependencyInjectionSample.Controllers
{
    public class OperationsController : Controller
    {
        private readonly OperationService _operationService;
        private readonly IOperationTransient _transientOperation;
        private readonly IOperationScoped _scopedOperation;
        private readonly IOperationSingleton _singletonOperation;
        private readonly IOperationSingletonInstance _singletonInstanceOperation;

        public OperationsController(OperationService operationService,
            IOperationTransient transientOperation,
            IOperationScoped scopedOperation,
            IOperationSingleton singletonOperation,
            IOperationSingletonInstance singletonInstanceOperation)
        {
            _operationService = operationService;
            _transientOperation = transientOperation;
            _scopedOperation = scopedOperation;
            _singletonOperation = singletonOperation;
            _singletonInstanceOperation = singletonInstanceOperation;
        }

        public IActionResult Index()
        {
            // ViewBag contains controller-requested services
            ViewBag.Transient = _transientOperation;
            ViewBag.Scoped = _scopedOperation;
            ViewBag.Singleton = _singletonOperation;
            ViewBag.SingletonInstance = _singletonInstanceOperation;

            // Operation service has its own requested services
            ViewBag.Service = _operationService;
            return View();
        }
    }
}

अब इस नियंत्रक कार्रवाई के लिए दो अलग-अलग अनुरोध किए गए हैं:

पहला निवेदन

दूसरा निवेदन

OperationIdमानों में से कौन सा मान किसी अनुरोध के भीतर और अनुरोधों के बीच भिन्न होता है।

  • क्षणिक वस्तुएँ हमेशा अलग होती हैं; प्रत्येक नियंत्रक और हर सेवा को एक नया उदाहरण प्रदान किया जाता है।

  • स्कोप की गई वस्तुएँ अनुरोध के भीतर समान होती हैं, लेकिन विभिन्न अनुरोधों में भिन्न होती हैं

  • सिंगलटन ऑब्जेक्ट्स हर ऑब्जेक्ट और हर रिक्वेस्ट के लिए समान होते हैं (चाहे कोई भी उदाहरण दिया गया हो ConfigureServices)


14
मैंने उनमें से प्रत्येक के कार्यों को समझा, लेकिन क्या कोई एक के बजाय एक का उपयोग करने के प्रभाव की व्याख्या कर सकता है। यदि सही तरीके से उपयोग नहीं किया जाता है या दूसरे के बजाय एक का चयन करने के कारण क्या समस्या हो सकती है।
पावन नेपल

2
मान लें कि आप एक अनुरोध संदर्भ संबंधित वस्तु (वर्तमान उपयोगकर्ता की तरह) सिंगलटन स्कोप के साथ बना रहे हैं, तो यह सभी HTTP अनुरोधों पर एक ही उदाहरण रहने वाला है, जो वांछित नहीं है। आईओसी सभी उदाहरण बनाने के बारे में है, इसलिए हमें यह निर्दिष्ट करने की आवश्यकता है कि निर्मित आवृत्ति का दायरा क्या है।
अकाजेमिस

1
यह विषय के शीर्ष पर लिंक का उल्लेख किया है! नमूना कोड एमएस डॉक्स से कॉपी / चिपकाया जाता है
akazemis

1
धन्यवाद। हाँ सिंगलटन सत्र / उपयोगकर्ता की परवाह किए बिना पूरे ऐप में समान होगा। जाहिर है अगर आपका ऐप माइक्रोसॉफ़्ट आर्किटेक्चर का उपयोग कर रहा है और प्रत्येक सेवा एक अलग प्रक्रिया में चलती है, तो सिंगलटन प्रत्येक प्रक्रिया में समान होगा
akazemis

1
क्या आप हमें ऐड-ऑन का उपयोग कर सकते हैं। क्योंकि मुझे इसका उपयोग करने के लिए कोई उपयोगिता नहीं मिली, जबकि यह बहुत अधिक संसाधनों का उपयोग करता है
Terai

318

.NET के निर्भरता इंजेक्शन में तीन प्रमुख जीवनकाल हैं:

सिंगलटन जो पूरे एप्लिकेशन में एक एकल उदाहरण बनाता है। यह पहली बार उदाहरण बनाता है और सभी कॉल में एक ही ऑब्जेक्ट का पुन: उपयोग करता है।

स्कोपेड आजीवन सेवाएं गुंजाइश के भीतर अनुरोध के अनुसार एक बार बनाई जाती हैं। यह मौजूदा दायरे में एक सिंगलटन के बराबर है। उदाहरण के लिए, MVC में यह प्रत्येक HTTP रिक्वेस्ट के लिए एक इंस्टेंस बनाता है, लेकिन यह एक ही वेब रिक्वेस्ट के भीतर अन्य कॉल्स में उसी इंस्टेंस का उपयोग करता है।

क्षणिक आजीवन सेवाएं हर बार अनुरोध करने के बाद बनाई जाती हैं। यह जीवनकाल हल्के, स्टेटलेस सेवाओं के लिए सबसे अच्छा काम करता है।

यहां आप अंतर देख सकते हैं और उदाहरण देख सकते हैं:

ASP.NET 5 6 चरणों में MVC6 निर्भरता इंजेक्शन (मृत लिंक के कारण वेब संग्रह लिंक)

आपका निर्भरता इंजेक्शन तैयार ASP.NET: ASP.NET 5

और यह आधिकारिक दस्तावेज का लिंक है:

ASP.NET कोर में निर्भरता इंजेक्शन


22
क्या आप बता सकते हैं कि क्षणिक सबसे हल्का क्यों है? मैंने सोचा कि क्षणिक सबसे भारी काम है क्योंकि इसे हर इंजेक्शन के लिए हर बार एक उदाहरण बनाने की जरूरत है।
विशेषज्ञ

17
आप सही हे। क्षणिक सबसे हल्का नहीं है, मैंने सिर्फ इतना कहा कि यह हल्के
रेस्टफुल

3
तो हम किस परिदृश्य में स्कोप का उपयोग कर सकते हैं और उदाहरण के लिए नियंत्रक में क्षणिक अगर हम डेटाबेस से कुछ पंक्तियों को प्राप्त कर रहे हैं? मैं इस मामले में scoped बनाम क्षणिक उपयोग परिदृश्य को समझने की कोशिश कर रहा हूं।
सेंसेई

4
यह वास्तव में आपके द्वारा अपेक्षित तर्क पर निर्भर करता है। उदाहरण के लिए, यदि यह एकल db कॉल है तो वास्तव में इससे कोई फर्क नहीं पड़ता है कि आप किसका उपयोग कर रहे हैं। लेकिन अगर आप एक ही अनुरोध में कई बार db बुला रहे हैं, तो आप स्कोपेड लाइफटाइम का उपयोग कर सकते हैं, क्योंकि यह मेमोरी में समान रिपॉजिटरी ऑब्जेक्ट रखता है और एक ही Http रिक्वेस्ट संदर्भ में कई बार पुन: उपयोग करता है। जबकि क्षणिक व्यक्ति एक नई रिपॉजिटरी ऑब्जेक्ट को कई बार बनाता है (और अधिक मेमोरी का उपभोग करता है)। यदि आप अपने विशिष्ट परिदृश्य की व्याख्या करते हैं, तो यह निर्धारित करना आसान होगा कि कौन सा बेहतर है।
akazemis

2
यहाँ पर प्रकाश डालने के लिए एक महत्वपूर्ण बिंदु सिंग्लटन, स्कोप्ड और ट्रांसिएंट रूसी डोल की तरह हैं, एक दूसरे के भीतर। घोंसले बनाते समय, उदाहरण के लिए, उनके आदेश को उलट देना संभव नहीं है। स्कोप्ड या सिंगलटन एक क्षणिक में शामिल नहीं किया जा सकता है, क्योंकि हम माता-पिता के जीवनकाल का विस्तार करेंगे जो कि रोकथाम के खिलाफ जाता है!
डीएल नरसिम्हन

34

ASP.NET MVC कोर DI में क्षणिक, स्कोप्ड और सिंगलटन ऑब्जेक्ट निर्माण प्रक्रिया को परिभाषित करते हैं जब एक ही प्रकार की कई वस्तुओं को इंजेक्ट किया जाना होता है। यदि आप निर्भरता इंजेक्शन के लिए नए हैं तो आप इस DI IoC वीडियो को देख सकते हैं ।

आप नीचे दिए गए नियंत्रक कोड को देख सकते हैं जिसमें मैंने निर्माणकर्ता में "IDal" के दो उदाहरणों का अनुरोध किया है। यदि एक ही उदाहरण "_dal" और "_dal1" या अलग-अलग इंजेक्ट किया जाएगा, तो क्षणिक, स्कोप्ड और सिंगलटन परिभाषित करते हैं।

public class CustomerController : Controller
{
    IDal dal = null;

    public CustomerController(IDal _dal,
                              IDal _dal1)
    {
        dal = _dal;
        // DI of MVC core
        // inversion of control
    }
}

क्षणिक: क्षणिक में, एक ही अनुरोध और प्रतिक्रिया में नए ऑब्जेक्ट इंस्टेंस इंजेक्ट किए जाएंगे। नीचे एक स्नैपशॉट छवि है जहां मैंने GUID मान प्रदर्शित किए हैं।

यहां छवि विवरण दर्ज करें

स्कोप्ड: स्कोप्ड में, एक ही अनुरोध और प्रतिक्रिया में एक ही ऑब्जेक्ट इंस्टेंस को इंजेक्ट किया जाएगा।

यहां छवि विवरण दर्ज करें

सिंगलटन: सिंगलटन में, सभी अनुरोधों और प्रतिक्रियाओं पर एक ही वस्तु इंजेक्ट की जाएगी। इस मामले में ऑब्जेक्ट का एक वैश्विक उदाहरण बनाया जाएगा।

नीचे एक सरल आरेख है जो उपरोक्त मौलिक दृष्टि से बताता है।

MVC DI छवि

उपरोक्त छवि एसबीएसएस टीम द्वारा खींची गई थी जब मैं मुंबई में ASP.NET MVC प्रशिक्षण ले रहा था । उपरोक्त छवि बनाने के लिए SBSS टीम में एक बड़ा धन्यवाद जाता है।


9
यह मेरे द्वारा देखी गई एक क्षणिक सेवा का एकल सबसे जटिल विवरण है। क्षणिक = किसी भी समय यह सेवा हल हो जाने पर आपके चर को निर्दिष्ट करने के बराबर है new TService। स्कोप्ड उस "गुंजाइश" (ज्यादातर मामलों में http अनुरोध) के लिए इसके पहले आरंभीकरण को कैश करेगा। सिंगलटन आवेदन के जीवनकाल के लिए कभी भी केवल एक उदाहरण को कैश करेगा, उतना ही सरल। ऊपर दिए गए आरेख इतने जटिल हैं।
मर्दोक्सएक्स

2
तो माफ करना, मैंने सोचा कि मैं इसे आरेख और कोड स्नैपशॉट के साथ अधिक सरल बना दूंगा :-) लेकिन मुझे आपकी बात समझ में नहीं आई।
शिवप्रसाद कोईराला

30
  • सिंगलटन जीवन भर के लिए एक एकल उदाहरण है।
  • स्कोप किए गए अनुरोध की अवधि के लिए स्कोप एक एकल उदाहरण है, जिसका अर्थ है ASP.NET में प्रति HTTP अनुरोध।
  • कोड अनुरोध के अनुसार क्षणिक एक एकल उदाहरण है ।

आम तौर पर कोड अनुरोध को एक निर्माता पैरामीटर के माध्यम से किया जाना चाहिए, जैसे कि

public MyConsumingClass(IDependency dependency)

मैं @ akazemis के उत्तर में इंगित करना चाहता था कि DI के संदर्भ में "सेवाएं" रेस्टफुल सेवाओं का अर्थ नहीं है; सेवाएँ उन निर्भरताओं के कार्यान्वयन हैं जो कार्यक्षमता प्रदान करती हैं।


16

AddSingleton ()

AddSingleton () पहली बार अनुरोध किए जाने पर सेवा का एक एकल उदाहरण बनाता है और उन सभी स्थानों पर उसी उदाहरण का पुन: उपयोग करता है जहां उस सेवा की आवश्यकता होती है।

AddScoped ()

एक स्कॉप्ड सेवा में, हर HTTP अनुरोध के साथ, हमें एक नया उदाहरण मिलता है। हालांकि, एक ही HTTP अनुरोध के भीतर, यदि सेवा कई स्थानों पर आवश्यक है, जैसे कि दृश्य और नियंत्रक में, तो उसी HTTP अनुरोध के संपूर्ण दायरे के लिए एक ही उदाहरण प्रदान किया जाता है। लेकिन हर नए HTTP अनुरोध को सेवा का एक नया उदाहरण मिलेगा।

AddTransient ()

एक क्षणिक सेवा के साथ, हर बार एक सेवा उदाहरण प्रदान किया जाता है, चाहे वह उसी HTTP अनुरोध के दायरे में हो या विभिन्न HTTP अनुरोधों में।


5

इस प्रश्न का उत्तर खोजने के बाद मुझे एक उदाहरण के साथ एक शानदार स्पष्टीकरण मिला जिसे मैं आपके साथ साझा करना चाहूंगा।

आप एक वीडियो देख सकते हैं जो यहां अंतर प्रदर्शित करता है

इस उदाहरण में हमारे पास यह कोड दिया गया है:

public interface IEmployeeRepository
{
    IEnumerable<Employee> GetAllEmployees();
    Employee Add(Employee employee);
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MockEmployeeRepository : IEmployeeRepository
{
    private List<Employee> _employeeList;

    public MockEmployeeRepository()
    {
        _employeeList = new List<Employee>()
    {
        new Employee() { Id = 1, Name = "Mary" },
        new Employee() { Id = 2, Name = "John" },
        new Employee() { Id = 3, Name = "Sam" },
    };
    }

    public Employee Add(Employee employee)
    {
        employee.Id = _employeeList.Max(e => e.Id) + 1;
        _employeeList.Add(employee);
        return employee;
    }

    public IEnumerable<Employee> GetAllEmployees()
    {
        return _employeeList;
    }
}

HomeController

public class HomeController : Controller
{
    private IEmployeeRepository _employeeRepository;

    public HomeController(IEmployeeRepository employeeRepository)
    {
        _employeeRepository = employeeRepository;
    }

    [HttpGet]
    public ViewResult Create()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Create(Employee employee)
    {
        if (ModelState.IsValid)
        {
            Employee newEmployee = _employeeRepository.Add(employee);
        }

        return View();
    }
}

दृश्य बनाएँ

@model Employee
@inject IEmployeeRepository empRepository

<form asp-controller="home" asp-action="create" method="post">
    <div>
        <label asp-for="Name"></label>
        <div>
            <input asp-for="Name">
        </div>
    </div>

    <div>
        <button type="submit">Create</button>
    </div>

    <div>
        Total Employees Count = @empRepository.GetAllEmployees().Count().ToString()
    </div>
</form>

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IEmployeeRepository, MockEmployeeRepository>();
}

इस कोड को कॉपी-पेस्ट करें और दृश्य में क्रिएट बटन पर दबाएं और बीच में स्विच करें AddSingleton, AddScopedऔर AddTransientआपको हर बार एक अलग परिणाम मिलेगा जो आपको इस स्पष्टीकरण को समझने में मदद कर सकता है:

AddSingleton () - जैसा कि नाम से ही स्पष्ट है, AddSingleton () विधि एक सिंगलटन सेवा बनाती है। पहली बार अनुरोध किए जाने पर एक सिंगलटन सेवा बनाई जाती है। इसके बाद इसी उदाहरण का उपयोग बाद के सभी अनुरोधों द्वारा किया जाता है। तो सामान्य तौर पर, एक सिंगलटन सेवा प्रति एप्लिकेशन केवल एक बार बनाई जाती है और उस एकल उदाहरण का उपयोग पूरे जीवन काल में किया जाता है।

AddTransient () - यह विधि एक Transient सेवा बनाती है। हर बार अनुरोध किए जाने पर एक क्षणिक सेवा का एक नया उदाहरण बनाया जाता है।

AddScoped () - यह विधि एक Scoped सेवा बनाती है। स्कोप्ड सेवा का एक नया उदाहरण स्कोप के अनुरोध के अनुसार एक बार बनाया जाता है। उदाहरण के लिए, एक वेब एप्लिकेशन में यह प्रत्येक http अनुरोध के अनुसार 1 उदाहरण बनाता है लेकिन उसी वेब अनुरोध के भीतर अन्य कॉल में उसी उदाहरण का उपयोग करता है।


2

जिसका उपयोग करना है

क्षणिक

  • चूंकि वे हर बार बनाए जाते हैं इसलिए वे अधिक मेमोरी और संसाधनों का उपयोग करेंगे और प्रदर्शन पर नकारात्मक प्रभाव डाल सकते हैं
  • हल्के सेवा के लिए इसका उपयोग कम या बिना किसी राज्य के करें

दायरे वाला

  • बेहतर विकल्प जब आप अनुरोध के भीतर राज्य बनाए रखना चाहते हैं।

एकाकी वस्तु

  • इन सेवाओं में मेमोरी लीक समय के साथ बढ़ेगी।
  • वे भी हर जगह पुन: उपयोग किए जाने के बाद बनाए गए स्मृति कुशल होते हैं।

एकल का उपयोग करें जहां आपको एप्लिकेशन विस्तृत स्थिति बनाए रखने की आवश्यकता होती है। एप्लिकेशन कॉन्फ़िगरेशन या पैरामीटर, लॉगिंग सेवा, डेटा की कैशिंग कुछ ऐसे उदाहरण हैं जहां आप सिंगलटन का उपयोग कर सकते हैं।

दूसरे में विभिन्न जन्मों के साथ इंजेक्शन लगाने की सेवा

  1. सिंगप्ले सेवा में स्कोप और क्षणिक सेवाओं को कभी भी इंजेक्ट न करें। (यह प्रभावी रूप से सिंगलटन में क्षणिक या स्कोप्ड सेवा को परिवर्तित करता है।)
  2. कभी भी क्षणिक सेवाओं में क्षणिक सेवाओं को इंजेक्ट न करें (यह क्षणिक सेवा को scoped में परिवर्तित करता है।)

यह सबसे अच्छा जवाब है। मुझे वह हिस्सा पसंद है जहां आप उदाहरण देते हैं। यह समझना मुश्किल नहीं है कि वे कैसे काम करते हैं। यह सोचना अधिक कठिन है कि कौन सी सेवा कहां रखी जाए और कैसे और कब स्मृति को साफ किया जाए। यदि आप इसके बारे में अधिक बताएंगे तो बहुत अच्छा होगा।
वेलेंटाइन

1

जैसा कि यहां वर्णित है (यह लिंक बहुत उपयोगी है) एक उदाहरण के साथ,

इंटरफ़ेस और ठोस प्रकार के बीच यह मानचित्रण परिभाषित करता है, कि हर बार जब आप एक प्रकार के IContryService का अनुरोध करते हैं, तो आपको देश सेवा का एक नया उदाहरण मिलेगा। इस मामले में क्षणिक का यही अर्थ है। आप सिंगलटन मैपिंग (एडसिंगटन का उपयोग करके) और स्कॉप्ड मैपिंग (एडस्कॉप्टर का उपयोग करके) जोड़ने में भी सक्षम हैं। इस मामले में स्कोप्ड का अर्थ है HTTP अनुरोध के लिए स्कूप किया गया, जिसका अर्थ यह भी है कि यह एक सिंगलटन है जबकि वर्तमान अनुरोध चल रहा है। आप AddInstance विधि का उपयोग करके DI कंटेनर में एक मौजूदा उदाहरण भी जोड़ सकते हैं। IServiceCollection में पंजीकरण के लिए ये लगभग पूर्ण तरीके हैं


0

AddSingleton बनाम AddScoped बनाम AddTransient के बीच अंतर

सेवाओं का पंजीकरण

ASP.NET कोर निर्भरता इंजेक्शन कंटेनर के साथ सेवाओं को पंजीकृत करने के लिए निम्नलिखित 3 तरीके प्रदान करता है। जिस विधि का हम उपयोग करते हैं वह पंजीकृत सेवा के जीवनकाल को निर्धारित करता है।

AddSingleton () - जैसा कि नाम से ही स्पष्ट है, AddSingleton () विधि एक सिंगलटन सेवा बनाती है। पहली बार अनुरोध किए जाने पर एक सिंगलटन सेवा बनाई जाती है। इसके बाद इसी उदाहरण का उपयोग बाद के सभी अनुरोधों द्वारा किया जाता है। तो सामान्य तौर पर, एक सिंगलटन सेवा प्रति एप्लिकेशन केवल एक बार बनाई जाती है और उस एकल उदाहरण का उपयोग पूरे जीवन काल में किया जाता है।

AddTransient () - यह विधि एक Transient सेवा बनाती है। हर बार अनुरोध किए जाने पर एक क्षणिक सेवा का एक नया उदाहरण बनाया जाता है।

AddScoped () - यह विधि एक Scoped सेवा बनाती है। स्कोप्ड सेवा का एक नया उदाहरण स्कोप के अनुरोध के अनुसार एक बार बनाया जाता है। उदाहरण के लिए, एक वेब एप्लिकेशन में यह प्रत्येक http अनुरोध के अनुसार 1 उदाहरण बनाता है लेकिन उसी वेब अनुरोध के भीतर अन्य कॉल में उसी उदाहरण का उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.