TL; DR
Objek transien selalu berbeda; contoh baru disediakan untuk setiap pengontrol dan setiap layanan.
Objek yang dilingkupi sama dalam permintaan, tetapi berbeda di antara permintaan yang berbeda.
Objek singleton adalah sama untuk setiap objek dan setiap permintaan.
Untuk klarifikasi lebih lanjut, contoh ini dari dokumentasi ASP.NET menunjukkan perbedaan:
Untuk menunjukkan perbedaan antara opsi masa hidup dan pendaftaran ini, pertimbangkan antarmuka sederhana yang mewakili satu atau beberapa tugas sebagai operasi dengan pengidentifikasi unik OperationId
,. Bergantung pada bagaimana kami mengonfigurasi masa pakai untuk layanan ini, wadah akan memberikan contoh layanan yang sama atau berbeda untuk kelas yang meminta. Untuk memperjelas masa hidup yang diminta, kami akan membuat satu jenis opsi seumur hidup:
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
{
}
}
Kami mengimplementasikan antarmuka ini menggunakan kelas tunggal Operation
,, yang menerima GUID dalam konstruktornya, atau menggunakan GUID baru jika tidak ada yang disediakan:
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;
}
}
Selanjutnya, dalam ConfigureServices
, setiap jenis ditambahkan ke wadah sesuai dengan masa pakai namanya:
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationSingletonInstance>(new Operation(Guid.Empty));
services.AddTransient<OperationService, OperationService>();
Perhatikan bahwa IOperationSingletonInstance
layanan ini menggunakan instance khusus dengan ID yang diketahui Guid.Empty
, sehingga akan menjadi jelas saat jenis ini digunakan. Kami juga telah mendaftarkan OperationService
yang tergantung pada masing-masing Operation
jenis lainnya , sehingga akan menjadi jelas dalam permintaan apakah layanan ini mendapatkan instance yang sama dengan controller, atau yang baru, untuk setiap jenis operasi. Semua layanan ini lakukan adalah mengekspos dependensi sebagai properti, sehingga mereka dapat ditampilkan dalam tampilan.
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;
}
}
}
Untuk menunjukkan masa hidup objek di dalam dan di antara permintaan individu yang terpisah ke aplikasi, sampel menyertakan OperationsController
yang meminta setiap jenis IOperation
jenis serta OperationService
. The Index
aksi kemudian menampilkan semua controller dan layanan ini OperationId
nilai-nilai.
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();
}
}
}
Sekarang dua permintaan terpisah dibuat untuk tindakan pengontrol ini:
Amati OperationId
nilai mana yang bervariasi dalam satu permintaan, dan antara permintaan.
Objek transien selalu berbeda; contoh baru disediakan untuk setiap pengontrol dan setiap layanan.
Objek yang dilingkupi sama dalam permintaan, tetapi berbeda di antara permintaan yang berbeda
Objek singleton adalah sama untuk setiap objek dan setiap permintaan (terlepas dari apakah instance disediakan di ConfigureServices
)