টি এল; ডিআর
ক্ষণস্থায়ী বস্তু সর্বদা পৃথক; প্রতিটি নিয়ামক এবং প্রতিটি পরিষেবায় একটি নতুন উদাহরণ সরবরাহ করা হয়।
একটি অনুরোধের মধ্যে Scoped অবজেক্টগুলি একই, তবে বিভিন্ন অনুরোধের মধ্যে পৃথক।
প্রতিটি বস্তু এবং প্রতিটি অনুরোধের জন্য সিঙ্গলটন অবজেক্টগুলি সমান।
আরও স্পষ্টতার জন্য, এএসপি.এনইটি ডকুমেন্টেশনের এই উদাহরণটি পার্থক্যটি দেখায়:
এই আজীবন এবং নিবন্ধকরণ বিকল্পগুলির মধ্যে পার্থক্য প্রদর্শনের জন্য, একটি সাধারণ ইন্টারফেস বিবেচনা করুন যা এক বা একাধিক কার্যকে একটি অনন্য শনাক্তকারী, সঙ্গে অপারেশন হিসাবে উপস্থাপন করে 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
, যা এর নির্মাতায় কোনও GID গ্রহণ করে, বা যদি কোনও সরবরাহ না করা হয় তবে একটি নতুন জিইউডি ব্যবহার করে:
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
কোন অনুরোধের মধ্যে এবং অনুরোধের মধ্যে মানগুলির মধ্যে কোনটি পরিবর্তিত হয় তা লক্ষ্য করুন ।
ক্ষণস্থায়ী বস্তু সর্বদা পৃথক; প্রতিটি নিয়ামক এবং প্রতিটি পরিষেবায় একটি নতুন উদাহরণ সরবরাহ করা হয়।
একটি অনুরোধের মধ্যে Scoped অবজেক্টগুলি একই, তবে বিভিন্ন অনুরোধের মধ্যে পৃথক
প্রতিটি বস্তু এবং প্রতিটি অনুরোধের জন্য সিঙ্গলটন অবজেক্টগুলি সমান (কোনও উদাহরণ দেওয়া আছে কিনা তা বিবেচনা না করে ConfigureServices
)