टी एल; डॉ
क्षणिक वस्तुएँ हमेशा अलग होती हैं; प्रत्येक नियंत्रक और हर सेवा को एक नया उदाहरण प्रदान किया जाता है।
स्कोप की गई वस्तुएँ अनुरोध के भीतर समान होती हैं, लेकिन विभिन्न अनुरोधों में भिन्न होती हैं।
सिंगलटन ऑब्जेक्ट्स प्रत्येक ऑब्जेक्ट और हर अनुरोध के लिए समान हैं।
अधिक स्पष्टीकरण के लिए, 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
और साथ ही एक शामिल है OperationService
। Index
कार्रवाई तो नियंत्रक और सेवा के के सभी प्रदर्शित करता है 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
)