2016-02-19 18 views
6

Ai đó có thể giúp tôi hiểu sau đây trong ngữ cảnh Dependency Injection trong Asp.Net 5 và xử lý đối tượng.Dependency Injection trong ASP.NET 5 và Object Dispose

Tôi cần hiểu liệu Dịch vụ của tôi có triển khai giao diện IDispose không, người sẽ gọi phương thức vứt bỏ.

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddTransient<IService, Service>(); 
    services.AddScoped<IService, Service>(); 
    services.AddSingleton<IService, Service>(); 
    services.AddInstance<IService, Service>(); 
}   

Trả lời

4

IServiceCollection chứa tập hợp các dịch vụ có sẵn trong ứng dụng của bạn. Bạn xác định các dịch vụ mà bạn muốn sử dụng và thời gian sử dụng của chúng và ứng dụng sẽ khởi tạo và xử lý chúng cho bạn.

Có 4 kiếp sống khác nhau:

thoáng

dịch vụ đời thoáng được tạo ra mỗi khi họ được yêu cầu. Tuổi thọ này hoạt động tốt nhất cho dịch vụ nhẹ, không quốc tịch.

scoped

dịch vụ đời scoped được tạo ra một lần mỗi yêu cầu.

Singleton

dịch vụ Singleton đời được tạo ra lần đầu tiên họ được yêu cầu, và sau đó mọi yêu cầu tiếp theo sẽ sử dụng cùng một ví dụ. Nếu ứng dụng của bạn yêu cầu hành vi đơn lẻ, cho phép vùng chứa dịch vụ quản lý tuổi thọ của dịch vụ được khuyến nghị thay vì triển khai mẫu thiết kế đơn lẻ và quản lý tuổi thọ của đối tượng trong chính lớp đó.

Instance

Bạn có thể chọn thêm một thể hiện trực tiếp đến container dịch vụ. Nếu bạn làm như vậy, cá thể này sẽ được sử dụng cho tất cả các yêu cầu tiếp theo (kỹ thuật này sẽ tạo ra một cá thể có phạm vi Singleton). Một sự khác biệt chính giữa dịch vụ Instance và dịch vụ Singleton là dịch vụ Instance được tạo ra trong ConfigureServices, trong khi dịch vụ Singleton được tải xuống lần đầu tiên nó được yêu cầu.

Các asp.net 5 tài liệu chính thức là rất tốt, dành thời gian để đọc nó: http://docs.asp.net/en/latest/fundamentals/dependency-injection.html


Các tài liệu không đề cập đến cách chính xác kiếp sống phụ thuộc được xử lý bởi các dịch vụ dependency injection nhưng nếu bạn tìm kiếm trong các mã, bạn sẽ tìm thấy ServiceProvider lớp, người quản lý kiếp: ServiceManager class

Để có một chút cụ thể hơn, khi một phạm vi được tạo ra, các service scope factory trả về một phạm vi dịch vụ mới, người được instanciated w ith một nhà cung cấp dịch vụ. Khi dịch vụ tiêm phụ thuộc phải vứt bỏ dịch vụ, anh gọi số service scope's dispose method, người gọi số service provider's dispose method.

Nhà cung cấp dịch vụ hoạt động như thế nào? Anh ta có tất cả phạm vi dịch vụ trong một thuộc tính, có tên là _resolvedServices và tất cả các mục có thể chuyển đổi trong một thuộc tính có tên _transientDisposables.Khi số gọi là dispose() method of the service provider, anh ấy lặp lại tất cả các mục anh ấy có trong hai thuộc tính này và đối với từng đối tượng gọi phương thức của anh ấy bị hủy.

Bạn có tất cả các mã nguồn ở đây: Dependency Injection source code

+0

Do nguồn IService sẽ được làm sạch giống như những gì C# sử dụng tuyên bố không – user334223

+0

Sử dụng tuyên bố định nghĩa một chút phạm vi của cuộc đời cho đối tượng ông sử dụng, bản thân mình. Dependency Injection hơi khác một chút và phức tạp hơn vì ứng dụng có thể giải quyết rất nhiều thứ cho bạn. Ví dụ, nếu bạn có một dịch vụ có Repository trong tài sản riêng, kho lưu trữ có ngữ cảnh EF db trong thuộc tính riêng, bạn chỉ cần kích động các nhà xây dựng với nhu cầu của họ, thêm từng dịch vụ trong lớp khởi động của bạn và ứng dụng sẽ quản lý chúng phụ thuộc cho bạn. Dù sao, các dịch vụ sẽ được làm sạch khi ứng dụng quyết định, tùy thuộc vào tuổi thọ bạn đã cung cấp cho họ. – AdrienTorris

+0

Đây là lý do tại sao sự lựa chọn của cuộc đời bạn cung cấp cho mỗi dịch vụ là rất quan trọng và cần phải được xem xét. – AdrienTorris

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