2017-07-01 23 views
5

tôi sao chép này từ ConfigureServices trong một ứng dụng web Tôi đang xây dựng, nơi tôi đang cố gắng để di chuyển ra khỏi các trang web và chỉ sử dụng một ứng dụng giao diện điều khiển hoặc dịch vụ:Phiên bản dịch vụ phạm vi được xử lý như thế nào trong ứng dụng .NET Core Console?

serviceCollection.AddScoped<IDbConnection, SqlConnection>(c => new SqlConnection(App.Configuration.GetConnectionString("DefaultConnection"))); 

Ứng dụng giao diện điều khiển hoạt động tốt, nhưng Tôi tự hỏi làm thế nào cuộc đời của kết nối được xử lý. Nếu và khi nào thì kết nối đóng và xử lý? Hay việc này có hoạt động giống như một thể hiện thoáng qua hay không, và tôi nên tự mình vứt bỏ nó?

Trả lời

6

Khi bạn xây dựng IServiceProvider từ IServiceCollection (BuildServiceProvider phương pháp) và bạn sử dụng trường hợp này của IServiceProvider để giải quyết IDbConnection bạn sẽ nhận được cùng một thể hiện của IDbConnection mỗi lần. Phạm vi được kết nối với IServiceProvider. để tạo ra phạm vi mới, bạn cần phải giải quyết từ container IServiceScopeFactory và sử dụng nó để tạo ra IServiceProvider được đặt phạm vi:

using (var scope = scopeFactory.CreateScope()) 
{ 
    var scopedConnection = scope.ServiceProvider.GetRequiredService<IDbConnection>();  
} 

kết nối sẽ được xử lý khi phạm vi được xử lý.

Trong phạm vi ASP Core được quản lý cho bạn bởi phần mềm trung gian tạo phạm vi mới và sau đó sử dụng IServiceProvider được đính kèm với phạm vi này để giải quyết Bộ điều khiển và mọi thứ trong yêu cầu web này. Trong ứng dụng giao diện điều khiển, bạn cần tự quản lý phạm vi.

+0

cách scopeFactory được kết nối với bộ sưu tập dịch vụ? –

+0

'IServiceScopeFactory' được tự động đăng ký trong' IServiceCollection' bởi khung công tác, do đó bạn không cần phải đăng ký theo cách thủ công. Sau đó bạn chỉ có thể giải quyết nó từ 'IServiceProvider'. –

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