TL; DR
วัตถุชั่วคราวนั้นแตกต่างกันเสมอ มีการให้อินสแตนซ์ใหม่ให้กับทุกคอนโทรลเลอร์และทุกบริการ
วัตถุที่ถูกกำหนดขอบเขตจะเหมือนกันภายในคำขอ แต่ต่างกันไปตามคำขอที่ต่างกัน
วัตถุ Singleton เหมือนกันสำหรับทุกวัตถุและทุกคำขอ
สำหรับการชี้แจงเพิ่มเติมตัวอย่างจากเอกสารคู่มือ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
บริการกำลังใช้อินสแตนซ์ที่เฉพาะเจาะจงที่มี ID ที่รู้จัก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
ค่าใดที่เปลี่ยนแปลงไปในคำขอและระหว่างคำขอ
วัตถุชั่วคราวนั้นแตกต่างกันเสมอ มีการให้อินสแตนซ์ใหม่ให้กับทุกคอนโทรลเลอร์และทุกบริการ
วัตถุที่ถูกกำหนดขอบเขตจะเหมือนกันภายในคำขอ แต่ต่างกันไปตามคำขอที่ต่างกัน
วัตถุ Singleton เหมือนกันสำหรับทุกวัตถุและทุกคำขอ (ไม่ว่าจะมีอินสแตนซ์ให้หรือไม่ConfigureServices
)