2016-11-28 19 views
11

ASP.NET Core sử dụng phương pháp khuyến nông trên IServiceCollection thiết lập dependency injection, sau đó khi một loại là cần thiết nó sử dụng các phương pháp thích hợp để tạo ra một trường hợp mới:Khi nào thì các trường hợp tiêm phụ thuộc .NET Core được xử lý?

  • AddTransient<T> - cho biết thêm một kiểu dữ liệu muốn tạo ra một lần nữa mỗi thời gian nó được yêu cầu.
  • AddScoped<T> - thêm loại được giữ cho phạm vi yêu cầu.
  • AddSingleton<T> - thêm loại khi được yêu cầu lần đầu và giữ nguyên.

Tôi có các loại thực hiện IDisposable và điều đó sẽ gây ra sự cố nếu chúng không được xử lý - trong mỗi mẫu khi được gọi là Dispose thực sự được gọi?

Có điều gì tôi cần phải thêm (chẳng hạn như xử lý ngoại lệ) để đảm bảo rằng cá thể đó luôn được xử lý không?

Trả lời

16

Đố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.

Các vấn đề liên quan