Đối tượng được giải quyết có cùng chu kỳ thời gian/vứt bỏ như thùng chứa của chúng, trừ khi bạn định vị thủ công các dịch vụ tạm thời bằng mã sử dụng phương thức using
hoặc .Dispose()
.
Trong ASP.NET Core, bạn nhận được một vùng chứa phạm vi được khởi tạo theo yêu cầu và được xử lý ở cuối yêu cầu. Tại thời điểm này, phụ thuộc phạm vi và thoáng qua đã được tạo ra bởi container này sẽ được xử lý quá (đó là nếu họ thực hiện IDisposable
giao diện), mà bạn cũng có thể nhìn thấy trên mã nguồn here.
public void Dispose()
{
lock (ResolvedServices)
{
if (_disposeCalled)
{
return;
}
_disposeCalled = true;
if (_transientDisposables != null)
{
foreach (var disposable in _transientDisposables)
{
disposable.Dispose();
}
_transientDisposables.Clear();
}
// PERF: We've enumerating the dictionary so that we don't allocate to enumerate.
// .Values allocates a ValueCollection on the heap, enumerating the dictionary allocates
// a struct enumerator
foreach (var entry in ResolvedServices)
{
(entry.Value as IDisposable)?.Dispose();
}
ResolvedServices.Clear();
}
}
Singletons được xử lý khi container mẹ bị xử lý, thường có nghĩa là khi ứng dụng tắt.
TL; DR: Chừng nào bạn không nhanh chóng scoped/dịch vụ thoáng qua trong quá trình startup ứng dụng (sử dụng app.ApplicationServices.GetService<T>()
) và dịch vụ của bạn thực hiện đúng giao diện dùng một lần (như pointed in MSDN) không có gì là bạn cần phải chăm sóc.
Vùng chứa mẹ không khả dụng ở bên ngoài phương thức Configure(IApplicationBuilder app)
trừ khi bạn thực hiện một số điều thú vị để có thể truy cập được ở bên ngoài (bạn không nên dùng nó).
Tất nhiên, được khuyến khích giải phóng các dịch vụ tạm thời càng sớm càng tốt, đặc biệt nếu chúng tiêu thụ nhiều tài nguyên.